剑指 Offer 56 - I. 数组中数字出现的次数
题目
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
思路
对数组nums进行一遍抑或运算,得到两个只出现一次数字的抑或运算结果,初始化一个数字m = 1,x和y是不同的,所以一定有一位是1,那么只要找到为1的二进制位,就可以将nums拆分成两个子数组,初始化一个辅助变量 m=1 ,通过与运算从右向左循环判断,可获取整数 x⊕y 哪一位是1。然后拆分nums为两个子数组,分别遍历两个子数组执行抑或,就可以得到两个只出现一次的数字。
代码
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int x = 0, y = 0, n = 0, m = 1;
for(int num : nums)
n ^= num;
while((n & m) == 0)
m <<= 1;
for(int num : nums) {
if(num & m) x ^= num;
else y ^= num;
}
return vector<int> {x, y};
}
};