剑指offer 数组中只出现一次的数字

题目

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

思路1
利用hashmap存储数组的数字并记录出现次数

import java.util.*;
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        Map<Integer,Integer> map=new HashMap();
        for(int i=0;i<array.length;i++){
            if(!map.containsKey(array[i]))
                map.put(array[i],1);
            else
                map.put(array[i],map.get(array[i])+1);
        }
        for(int i=0;i<array.length;i++){
            if(map.get(array[i])==1&&num1[0]==0)
                num1[0]=array[i];
            else if(map.get(array[i])==1&&num2[0]==0)
                num2[0]=array[i];
            
        }
    }
}

思路2

1 我们根据异或运算的性质:任何一个数字异或它自己都等于0 。也就是说,从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些出现两次的数字全部在异或中抵消掉了。
2因此如果能够把原数组分为两个子数组。在每个子数组中,包含一个只出现一次的数字,而其它数字都出现两次。如果能够这样拆分原数组,按照前面的办法就是分别求出这两个只出现一次的数字了。
3首先从头到尾依次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次的数字的异或结果。因为其它数字都出现了两次,在异或中全部抵消掉了。由于这两个数字肯定不一样,那么这个异或结果肯定不为0 (把这个异或结果记为temp),也就是说在这个结果数字的二进制表示中至少就有一位为1 。我们在结果数字中找到第一个为1 的位的位置,记为第N 位。现在我们以第N 位是不是1 为标准把原数组中的数字分成两个子数组。每个子数组包含只出现一次的数字,而其他数字出现两次。

public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        if(array.length<2||array==null) return ;
        int temp=0;
        for(int i=0;i<array.length;i++)
            temp^=array[i];
        int index=FirstBits(temp);
        for(int i=0;i<array.length;i++){
            if(isTrue(array[i],index))
                num1[0]^=array[i];
            else
                num2[0]^=array[i];
        }
    }
    //找出第一个1的位置,划分出两个子数组
    public int FirstBits(int temp){
        int index=0;
        while((temp&1)==0&&index<32){
            temp=temp>>1;
            index++;
        }
        return index;
    }
//这个isTrue函数可以判断 该数在前半个子数组还是在后半个子数组
    public boolean isTrue(int num,int index){
        num=num>>index;
        return (num&1)==1;
    }
}
发布了64 篇原创文章 · 获赞 4 · 访问量 1218
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览