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

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 << "\tExpected ret=" << tc.ret << endl;
cout << "\tAcutal   ret=" << actual_ret << endl;
}

actual_ret = find2(tc.nums);

if (tc.ret != actual_ret) {
cout << "Case #" << iii << ": FAILED" <<  endl;
cout << "\tExpected ret=" << tc.ret << endl;
cout << "\tAcutal   ret=" << actual_ret << endl;
}

}

return 0;
}

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

posted @ 2015-09-12 21:23 loverszhaokai 阅读(...) 评论(...) 编辑 收藏