一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
如果我们可以把所有数字分成两组,使得:
-
两个只出现一次的数字在不同的组中;
-
相同的数字会被分到相同的组中。
那么对两个组分别进行异或操作,即可得到答案的两个数字。这是解决这个问题的关键。
那么如何实现这样的分组呢?
var singleNumbers = function(nums) {
var tmp = 0;
for(var i=0;i<nums.length;i++){
tmp=tmp^nums[i];
}
var mark = 1; // mark就是分组凭据
while((mark & tmp) === 0) { // 一直到找到第一个1为止
mark <<= 1;
}
var arr1 = 0;
var arr2 = 0;
for(var i=0;i<nums.length;i++){
if((nums[i]&mark)==0){
arr1=arr1^nums[i];
}else{
arr2=arr2^nums[i];
}
}
return [arr1,arr2];
};