137. Single Number II

本文介绍了一种解决SingleNumberII问题的独特算法思路。通过分析每个数的二进制表示,统计每位上1出现的次数,并利用这些信息找出数组中唯一出现一次的数。此方法巧妙地利用了模3运算来过滤掉重复出现的数值。
    /*
     * 137. Single Number II
     * 2016-5-22 by Mingyang
     * 这道题目就是我的思路,你想啊,每一个数都用二进制来表示,每一个位上面的1的个数之和应该是3的整数倍
     * 如果不是的话,那么那位就是多的1,所以我们用1来&就可以知道所有第一位上的情况,然后1要移动变为10,也可以将
     * 要检查的数字移动,往右边移动一位,这样第二位也就移动到第一位来了,同时相应的数组也记数
     * 这样我们在后面得到了一个数组包含了很多1的数量在上面,最后我们再把每一位模3以后还原,加到res上面
     */
     public int singleNumber1(int[] A) {  
         if(A.length == 0||A==null)  
            return 0;      
        int[] cnt = new int[32];  
        for(int i = 0; i < A.length; i++){  
            for(int j = 0; j < 32; j++){  
                if( (A[i]>>j & 1) ==1){  
                    cnt[j]++;  
                }  
            }  
        }  
        int res = 0;  
        for(int i = 0; i < 32; i++){  
            res += (cnt[i]%3 << i);
          //res |= (cnt[i]%3 << i);
        }  
        cnt = null;  
        return res;  
    }

 

转载于:https://www.cnblogs.com/zmyvszk/p/5518726.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值