题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明
算法应具有线性时间复杂度,且不使用额外空间来实现。
示例
说明:
- 输入
- 第一行输入数组个数
- 第二行输入数组元素
- 输出
- 打印输出所找到的只出现一次的数字
示例 1 :
输入:
3
2 2 1
输出:
1
示例 2 :
输入:
1
4 1 2 1 2
输出:
4
题解
数组中除了一个数字只出现了一次,其它数字都出现了两次。要求算法具有线性复杂度 ({O(N)}) ,且不使用额外空间。那么只遍历了一遍数组,最终结果保存在原数组的某个位置。
由 0 ^ a = a
、a ^ a = 0
可以得出,若对数组中任意两个相同的数字按位异或结果则为 0 ,最后将剩下唯一的出现了一次的数字。
如果数组中除了某个元素出现奇数次以外,其余每个元素均出现偶数次,那么也可以使用此种算法求出出现奇数次的数字。
代码
#include <iostream>
#include <vector>
using namespace std;
int singleNumber(vector<int>& nums)
{
int len = nums.size();
for (int i = 1; i < len; i++)
{
nums[0] ^= nums[i];
}
return nums[0];
}
int main()
{
vector<int> nums;
int n = 0, num = 0;
cin >> n;
while (n--)
{
cin >> num;
nums.push_back(num);
}
cout << singleNumber(nums) << endl;
return 0;
}