题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解题思路1:使用HashMap将数组中的值当做key存储到HashMap中,当key值存在时说明有2次,删除当前的key,不存在的时候存入新的key值,最后HashMap中只剩最后两个key值,即为所求,将里面的key取出。
//num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 import java.util.HashMap; import java.util.Iterator; public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { HashMap<Integer,Integer> map = new HashMap<>(); //遍历数组,添加到HashMap中 for(int i : array){ if(map.containsKey(i)){ //当前key存在,则删除key map.remove(i); }else{ //不存在,将key添加到map中 map.put(i,1); } } //使用迭代器对HashMap中的key进行迭代 Iterator iter = map.keySet().iterator(); //取出仅剩的两个key值 num1[0] = (Integer)iter.next(); num2[0] = (Integer)iter.next(); } }解题思路2:
异或的特点,相同为0,不同为1,任何数与0异或都等于本身;先使用target记录每个值异或后的结果,由于相同异或为0,所以最后只剩下最两个结果异或;取到其中为1的位,这一位一定是一个为0一个为1才得到的结果,让其余为都为0赋值给target 。这个target主要是将数组中的数字分成两类,一类中包含其中一个结果。最后将两类分别异或,最后每一类就只剩下想要的结果。 //num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 public class Solution { //使用位运算,异或特点,相同为0,不同为1 public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { //设定初始值为0 int target = 0; for(int i : array){ //异或每一个数,最后剩下的就是两个结果异或的 target ^= i; } //取异或结果中一位为1的数字进行区分两个数字 target &= -target;//取到最后为1的一位 for(int i : array){ //根据target将所有数字分为两类 if((target & i) == 0){ //第一类异或取到第一个数 num1[0] ^= i; }else{ //第二类异或取到第二个数 num2[0] ^= i; } } } }