题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
题解:
题解一:利用HashMap
public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer> ();
for(int i = 0;i < array.length;i++){
int n = map.getOrDefault (array[i],0);
map.put (array[i],n+1);
}
boolean flag = true;
for(int i = 0;i < array.length;i++){
if(map.get (array[i]) == 1 ){
if(flag == true){
flag = false;
num1[0] = array[i];
}else{
num2[0] = array[i];
}
}
}
}
题解二:
(1)将整个数组异或,异或的结果为俩个单独数字异或的结果。
(2)求出这个结果中从左往右的第一个为1的比特位,记为index。
(3) 再将数组中的每个元素都与index,这样能使index位相同的元素分到一组。
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int key = array[0];
for(int i = 1;i < array.length;i++){
key = key ^ array[i];
}
// 找到位数不同的是第几位
int index = 1;
while((index & key) == 0){
index <<= 1;
}
int res1 = 0;
int res2 = 0;
for(int i = 0;i < array.length;i++){
if((index & array[i]) == 0){
res1 ^= array[i];
}else {
res2 ^= array[i];
}
}
num1[0] = res1;
num2[0] = res2;
}
C语言版本:https://blog.csdn.net/qq_43632625/article/details/90677011