题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解题思路—HashMap:判断有没有重复,可以想到的是使用HashMap。遍历数组将数字存入HashMap,因为其他数字都出现了两次,所以在Map中检测到有当前数字时,直接将其删除,最后HashMap中就只留下只出现过一次的数字。
解题思路—异或:这题可以用异或巧解!异或定义:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)。两个相同数字异或为0,一个数和0异或还是它本身。 所以将数组中所有数字异或,最后结果就是只出现一次的两个数字异或的值。找到这个值中第一个1出现的位置,这个1说明这两个数字从这一位起开始不同,这样可以将数组中的数字以这一位分组,所有相同的数字肯定存在于同一组,再将这两个数组分别异或,结果就是这两个数。推荐!
Java解题—HashMap
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
import java.util.HashMap;
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
HashMap<Integer, Integer> hashmap = new HashMap<>();
for(int i:array){
if(hashmap.containsKey(i))
hashmap.remove(i);
else
hashmap.put(i, i);
}
int[] num = new int[2];
int i=0;
for(int n:hashmap.keySet())
num[i++] = hashmap.get(n);
num1[0] = num[0];
num2[0] = num[1];
}
}
Java解题—异或
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array.length==0){
num1[0] = array[0];
}
// corbit中是最后两个不同数字异或的结果
int corbit = 0;
for(int n:array)
corbit ^= n;
// 找到corbit中第一个1出现的位置
int ind = 0;
while((corbit&1)==0){
corbit >>= 1;
ind++;
}
// 再次异或得到两个数字
for(int n:array){
if(((n>>ind)&1)==0)
num1[0] ^= n;
else
num2[0] ^= n;
}
}
}