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

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

解法:遇到重复数字出现要想到异或,A^A = 0 , 0 ^ A= A ,我们把数组异或完,得到的是tot = num1 ^ num2 , 那么如何将他们区分开呢? 找出tot的二进制下,最左边的1的位置idx,那么这个1必定由其中的一个num提供。因此把idx位置为1的数都异或起来,最终得到的是num1。 idx为0的位置异或,最终得到的是num2

 public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        if(array==null || array.length == 0)
            return;
        int tot = 0;
        for (int item : array) {
            tot ^= item;
        }
        int idx = 0;
        while ((tot&1)==0){
            tot = (tot >> 1);
            idx++;
        }
        for (int item : array) {
            if(bit(item,idx))
                num1[0] ^= item;
            else num2[0] ^= item;
        }
         
    }
    boolean bit(int num,int idx) {
        return ((num>>idx) &1) == 1;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值