题目
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
代码实现
位运算
狂神01笔记中有原题
class Solution {
public int[] singleNumbers(int[] nums) {
int xor = 0;
//循环结束时xor表示出现1次的两个数的异或
for (int n:nums) {
xor ^= n;
}
//得到xor最右边的1
int one = xor & (~xor+1);
//表示xor中的其中一个数
int xor2 = 0;
for (int n:nums) {
//按照n是否有最右的1将数组分成两种情况
if ((n & one) != 0) {
xor2 ^= n;
}
}
xor ^= xor2;
return new int[]{xor,xor2};
}
}