题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解题思路
- 位运算:任何数与本身进行异或(^)都为0,任何数与0进行异或都为0
- 将数组中的数字进行异或,相同数字抵消,最后异或的结果为两个只出现一次的数字进行异或的结果
- 最后结果中肯定包含1,找出1所在的位置index,根据这个位置将数组分为两个子数组,其中一个数组元素在index位置都有1,另一个数组在index位置都为0,由此将两个不同数字分在两个子数组中
- 对两个子数组元素依次进行异或操作,最后结果分别为不同数字的值
相关知识点
- 与运算(&):1&1=1;1&0=0;0&0=0;
代码实现
function FindNumsAppearOnce(array){
let res=[];
if(array.length<2){
return;
}
let bitRes=0;
for(let num of array){
bitRes ^= num;
}
let index=getBit(bitRes);
let number1=0;
let number2=0;
for(let num of array){
if(isSingle(num,index)){
number1 ^=num;
}else{
number2 ^=num;
}
}
res.push(number1,number2);
return res;
}
function getBit(number){ //找出1所在位置index
let index=0;
while((number & 1)==0 && index<64){
number = number >> 1;
index++;
}
return index;
}
function isSingle(number,index){ //根据index筛选出两个子数组
if((number >> index) & 1 == 1){ //数字在index位置为1
return true;
}else{
return false;
}
}