• 2015-09-09 [一点资讯]--数据抓取和处理工程师--4面


    时间:2015-09-09 14:40 ~ 15:40

    地点:北京市海淀区王庄路1号 清华同方科技广场D座 西区 7层

    1. 问项目经验和看过什么书

    2. 有3N+1个整数,其中只有一个数出现了一次,其它的数都出现了3次,查找唯一出现一次的那个数。

    https://leetcode.com/problems/single-number-ii/

    https://github.com/loverszhaokai/leetcode/blob/master/137_no/sol_bit_manipulation.cc

    #include <climits>
    #include <cmath>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int find(const vector<int> &nums)
    {
        int count[32];
    
        for (int iii = 0; iii < sizeof(count) / sizeof(int); iii++)
            count[iii] = 0;
    
        for (int iii = 0; iii < nums.size(); iii++) {
    
            int jjj = 1;
            int kkk = 1;
    
            while (jjj <= 32) {
    
                if (nums[iii] & kkk)
                    count[jjj - 1] = (count[jjj - 1] + 1) % 3;
    
                kkk <<= 1;
                jjj++;
            }
        }
    
        int ans = 0;
        int jjj = 1;
    
        for (int iii = 0; iii < sizeof(count) / sizeof(int); iii++) {
    
            if (count[iii])
                ans |= jjj;
    
            jjj <<= 1;
        }
    
        return ans;
    }
    
    // Use two integer instead of count[32]
    // 0 0 -> 0
    // 0 1 -> 1
    // 1 0 -> 2
    //
    int find2(const vector<int> &nums)
    {
        int high = 0;
        int low = 0;
    
        for (int iii = 0; iii < nums.size(); iii++) {
    
            int jjj = 1;
            int kkk = 1;
    
            while (jjj <= 32) {
    
                if (nums[iii] & kkk) {
    
                    if ((high & kkk) ^ (low & kkk) ^ kkk)
                        low |= kkk;
                    else
                        low &= ~kkk;
    
                    if ((high & kkk) ^ (low & kkk) ^ kkk)
                        high |= kkk;
                    else
                        high &= ~kkk;
                }
    
                kkk <<= 1;
                jjj++;
            }
        }
    
        int ans = 0;
        int iii = 1;
        int jjj = 1;
    
        while (iii <= 32) {
    
            if (low & jjj || high & jjj)
                ans |= jjj;
    
            jjj <<= 1;
            iii++;
        }
    
        return ans;
    }
    
    
    int main()
    {
        const struct TestCase {
            vector<int> nums;
            int ret;
        } test_cases[] = {
            {
                { 1, 1, 1, 3 },
                3
            },
            {
                { 1, 1, 1, 2, 3, 2, 2 },
                3
            },
            {
                { 1, 1, 1, 2, 3, 2, 2, 3, 4, 3 },
                4
            },
        };
    
        for (int iii = 0; iii < sizeof(test_cases) / sizeof(TestCase); iii++) {
    
            const TestCase &tc = test_cases[iii];
    
            int actual_ret = find(tc.nums);
    
            if (tc.ret != actual_ret) {
                cout << "Case #" << iii << ": FAILED" <<  endl;
                cout << "	Expected ret=" << tc.ret << endl;
                cout << "	Acutal   ret=" << actual_ret << endl;
            }
    
            actual_ret = find2(tc.nums);
    
            if (tc.ret != actual_ret) {
                cout << "Case #" << iii << ": FAILED" <<  endl;
                cout << "	Expected ret=" << tc.ret << endl;
                cout << "	Acutal   ret=" << actual_ret << endl;
            }
    
        }
    
        return 0;
    }

    3. 问github上的项目,推荐TypoChecker使用Trie树。

  • 相关阅读:
    词法分析程序~总结
    0916 词法分析程序
    0909 编译原理
    1029 文法分析
    0916 编译原理第二次上机作业
    0909 编译原理第一次上机作业
    复利计算之回顾并总结这三次实验
    复利计算之说明代码运行结果和功能点
    操作系统之实验0 了解和熟悉操作系统
    12-16 实验四 递归下降语法分析程序设计
  • 原文地址:https://www.cnblogs.com/lovers/p/4803636.html
Copyright © 2020-2023  润新知