按照前题的思路,还是利用异或求解....我们知道nums中的所有数异或的结果就是这两个只出现一次的数的异或结果....那么如果能找到一种分类方式将nums数组分成两组,每组中仅包含一个只出现一次的数二其他数在本组中都出现两次即可.....这种分类方法可以基于某一位的值来判断...因为出现两次的数根据某一位的值肯定都会被分在一边,而两个只出现一次的数肯定存在某一位不同.....我们不妨找到这两个数第一个不同的位,用该位的值来作为分类依据即可.....按照异或的性质,同0异1,那么这两个数异或结果中第一个为1的位就是我们要寻找的分类依据》。。。
任意一个数与上它的补码的结果即为这个数为1的最低位...那么思路很清楚了....
public class Solution {
public int[] singleNumber(int[] nums) {
int diff=0;
for( int n:nums )
{
diff ^= n;
}
diff=diff&(-diff);
int[] res=new int[2];
for( int n:nums )
{
if( (n&diff)==0 )
{
res[0]^=n;
}
else
{
res[1]^=n;
}
}
return res;
}
}