题目链接:力扣
题目描述:
解题思路:
之前我们做的136中只需要找到一个单次出现的数字,利用^得出了结果,而这道题我们需要得到两个单次出现的数字,和之前一样,我们利用^,但是我们得分成两个组,并且这两个数字不能在同一组。
1.先把所有数字异或起来
得到一个数字,可以发现得到的这个数当中的1,一定是两个数字对应位上不一样的数
2.这样我们就可以根据每个数字与该数字的关系将两个数字分到不同的组中
代码如下:
public static int[] singleNumber(int[] nums) {
int num=nums[0];
int i=0;
for(i=1;i<nums.length;i++)
num^=nums[i];
int k=0;
for(k=1;k<32;k++)
{
if(((num>>k)&1)==0)
break;
}
int[] a={0,0};
for(i=0;i<nums.length;i++)
{
if(((nums[i]>>k)&1)==0){
a[0]^=nums[i];
}else{
a[1]^=nums[i];
}
}
return a;
}
提示:先根据k找到哪位上取到1,然后让每位数字>>k位分组