题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路1:
常规操作,借助map记录数字出现的次数,再遍历map找到只出现1次的两个数。
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int start=array[0];
for(int i=1;i<array.length;i++){
start^=array[i];
}
int bitindex=0;
for(int i=0;i<32;i++){
if((start&1)==1){
bitindex = i;
break;
}
start>>=1;
}
for(int i=0;i<array.length;i++){
if((array[i]>>bitindex&1)==1){
num1[0]^=array[i];
}else{
num2[0]^=array[i];
}
}
}
}
思路二:
先异或执行一次,得到结果k,再找出K中bit位最后一位为1的数的位置记作bitindex.
再将原数组移动bitindex位数后,如果等于1,则和num[0]进行异或操作;否则和num[1]进行异或操作。最终得到的num[0]和num[1].
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int start=0;
for(int i=0;i<array.length;i++){
start^=array[i];
}
int bitindex=0;
for(int i=0;i<32;i++){
if((start&1)==1){
bitindex = i;
break;
}
start>>=1;
}
for(int i=0;i<array.length;i++){
if((array[i]>>bitindex&1)==1){
num1[0]^=array[i];
}else{
num2[0]^=array[i];
}
}
}
}