题目描述:
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
思路:
这个题其实是的力扣136题,唯一不同的是这道题中有两个只出现一次的数字,如果只有一个只出现一次的数字,思路很简单,就是数组的各个元素依次异或,一个数异或它本身是零,这样最后只剩下只出现一次的那个数字。现在有两个只出现一次的数字,那么我们就要想办法把这个数组分成两部分,只需要保证只出现一次的那两个数字处于不同的部分,而出现两次的数字处于相同的部分即可。
代码:
class Solution {
public int[] singleNumber(int[] nums) {
int ret = 0;
for(int i :nums){
ret ^= i;
}
int div = 1;
while((ret&div)==0){
div <<= 1;
}
int a = 0;
int b = 0;
for(int i : nums){
if((i&div)!=0){
a ^= i;
}else{
b ^= i;
}
}
return new int[]{a,b};
}
}