按照前题的思路,还是利用异或求解....我们知道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;
}
}
本文详细介绍了如何利用位操作和异或运算解决数组中寻找只出现一次的数的问题。通过将数组元素分为两组,一组中每个元素都出现了两次,另一组中恰好有一个元素只出现一次。利用特定位的异或性质,找出这个唯一的元素。此方法巧妙地解决了单一元素在数组中的定位问题。
724

被折叠的 条评论
为什么被折叠?



