思路:
要求空间复杂度为O(1),则排除哈希法
一个整型数组 nums
里除 一个 数字之外,其他数字都出现了两次
可以用异或运算,留下来的数字是出现一次的数字 x
代码:
class Solution {
public int[] singleNumbers(int[] nums) {
int x=0,y=0,n=0,m=1;
for(int num:nums){
//得到2位数
n=n^num;
}
//得到第一个1,相当于找不同
while((m&n)==0){
m<<=1;
}
//下面再遍历,因为分过组了,每组只会出现一个出现次数为1的值
for(int num:nums){
//&和==的优先级不一样,==大于&,所以要加括号
if((m&num)==0){
x=x^num;
}
else{
y=y^num;
}
}
return new int[]{x,y};
}
}
分解:
1)过程:
i)先遍历一遍,找到合起来的2个数字
ii)通过与1的&运算,找到第一位为1的地方,保存在m里
iii)再遍历一遍,按与m相&的不同结果,分成2组,这样每组只会出现一个出现次数为1的数字
把它们放进数组里即可
复杂度分析:
O(N) 遍历了2次,每次都是O(N)
O(1)使用异或,没有开辟额外空间,int[]不算是额外空间