GEEK编程练习— —寻找单个数
2016-06-02 21:08
183 查看
题目1
给定一组整数,其中除了一个整数只出现一次外,其他每个整数都是成双出现。找到这个只出现一次的整数。要求:
1、线性时间复杂度
2、不开辟额外内存空间
输入
0 0 1 3 2 4 1 4 2
输出
3
分析1
异或操作可以实现偶数次清零的功能。代码1
#include <iostream> #include <vector> using namespace std; int main() { vector<int> nums; int tmp; while (cin >> tmp) nums.push_back(tmp); int x = 0; for (auto i : nums) { x ^= i; } cout << x << endl; return 0; }
题目2
给定一组整数,其中除了一个整数只出现一次外,其他每个整数都出现3次。找到这个只出现一次的整数。要求:
1、线性时间复杂度
2、不开辟额外内存空间
输入
0 0 0 1 1 2 1 2 3 4 4 2 4
输出
3
分析2
其实,与题目1一样,考察的是位运算。输出的是整数,可以创建一个数组ncount[sizeof(int)],ncount[i]表示第i位出现1的次数。如果ncount[i]是3的整数倍,就忽略。否则就把改位取出来组成最终答案。
代码2
#include <iostream> #include <vector> using namespace std; int main() { vector<int> nums; int tmp; while (cin >> tmp) nums.push_back(tmp); const int W = sizeof(int) * 8; int ncount[W]{}; for (int i = 0; i < nums.size(); ++i) { for (int j = 0; j < W; ++j) { ncount[j] += (nums[i] >> j) & 1; ncount[j] %= 3; } } int result = 0; for (int i = 0; i < W; i++) { result += (ncount[i] << i); } cout << result << endl; return 0; }