面试题56-1数组中数字出现的次数
文章目录
题目
一个整型数组 nums
里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
考点
两个相同的数异或结果为0。将整个数组异或,结果就是两个只出现一次的数的异或结果。利用这个结果将两个数分开。
双循环实现
LeetCode版本
class Solution {
public:
int findBitPos(int num){
int pos =0;
while((num>>pos & 0x1) != 1){
pos++;
}
return pos;
}
vector<int> singleNumbers(vector<int>& nums) {
int xorres(0);
for(int i =0; i < nums.size(); i++){
xorres ^= nums[i];
}
int pos = findBitPos(xorres);
vector<int> res;
int num1(0), num2(0);
for(int i =0 ; i< nums.size(); i++){
if((nums[i]>>pos & 0x1) != 1){
num1 ^= nums[i];
}
else{
num2 ^= nums[i];
}
}
res.push_back(num1);
res.push_back(num2);
return res;
}
};