260. 只出现一次的数字 III
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
注意:
结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
class Solution {
public int[] singleNumber(int[] nums) {
int[] res=new int[]{-1,-1};
if(nums==null || nums.length==0){
return res;
}
int ans=0;
//通过第一个循环找到那两个出现过一次的数字的异或结果
for(int x:nums){
ans^=x;
}
int lastNumberOfOne=find(ans);
int num1=0,num2=0;
for(int x:nums){
if(judge(x,lastNumberOfOne)==0){
num1^=x;
}else{
num2^=x;
}
}
return new int[]{num1,num2};
}
//根据异或结果找到分割两个数字的方式:从右至左找到第一个位置不为0的地方
private int find(int ans){
int sum=1;
int res=1;
while((ans&res)==0){
sum++;
res<<=1;
}
return sum;
}
//判断x的从右往左看,第lastNumberOfOne位是否为1
private int judge(int x,int lastNumberOfOne){
x>>=(lastNumberOfOne-1);
return x&1;
}
}