您的位置:首页 > 编程语言

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 c++