题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
 
 
题目链接:

 

算法1:

set记录出现数字,第一次出现添加,第二次出现删除,最终只剩下只出现一次的数字。

算法2:

a^a = 0

a^b^a = b

对数组进行一次异或遍历,得到两个只出现一次的数字的异或结果re。(出现两次的数字会彼此异或掉)

re的每一位都可以表示,两个只出现一次数字的二进制上的不同,找道最低位上的1记为num。

根据num将数组分为两组,两个只出现一次的数字必定分别在两个不同的组中。

根据 a^b^a = b 分别找到两个只出现一次的数字。

 

 

 

 

 

 

 

 

 

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
import java.util.HashSet;
import java.util.Iterator;
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        int re =0;
        for(int i = 0;i<array.length;i++){
            re^=array[i];
        }
        //找到最右边1,即两个数字不同的位置
        int num = 1;
        while(true){
            if((num&re) > 0){
                break;
            }
            num <<= 1;
        }
        num1[0] = re;
        num2[0] = re;
        //将数组分为两组,以num记录位置是否是1为判断条件
        for(int i=0;i<array.length;i++){
            if((num&array[i])>0){
                num1[0]^=array[i];
            }else{
                num2[0]^=array[i];
            }
        }
        /*
        HashSet<Integer> set = new HashSet<>();
        for(int i = 0;i<array.length;i++){
            if(set.contains(array[i])){
                set.remove(array[i]);
            }else{
                set.add((array[i]));
            }
        }
        boolean flag = true;
        Iterator<Integer> num = set.iterator();
        while(num.hasNext()){
            Integer number = num.next();
            if(flag){
                num1[0] = number;
                flag =false;
            }else{
                num2[0] = number;
            }
        }
        */
    }
}

 

posted on 2020-06-09 13:23  MoonBeautiful  阅读(135)  评论(0编辑  收藏  举报