位运算,统计二进制位1出现的次数

数组中只出现一次的数(其它数出现k次)

http://www.nowcoder.com/questionTerminal/5d3d74c3bf7f4e368e03096bb8857871

因为除了出现一次的那个数,其他数都出现k次,那么这些出现k次的数,它对应的二进制位中,为1的bit位,也是出现k次的,那么就可以用一个大小为32的数组,记录数组中所有数在这32个bit位中,出现的1的次数,最终出现1次的数,它对应的为1的bit位中1出现的次数必定是对k取模余1的,那么这32个bit位中,谁对k取模,就将一个1向左移动对应数量的位,将所有这些移动后的数相加就是出现一次的数了。

    public int foundOnceNumber (int[] arr, int k) {
        // write code here

        if (arr == null){
            return 0;
        }

        int[] bitValue = new int[32];

        for (int i : arr) {
            for (int j = 0; j < 32; j++) {

                int cur = 1 << j;
                if ((cur & i) != 0){
                    bitValue[j] ++;
                }
            }

        }

        int res = 0;
        for (int i = 0; i < bitValue.length; i++) {

            if (bitValue[i] % k != 0){
                res += (1 << i);
            }
        }

        return res;
    }
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
06-25 21:00
门头沟学院 Java
多拆解背记一下当前的高频场景面试题,结合自己的项目经历去作答,面试通过率原来真的不会低!
牛客965593684号:小公司不就是这样的吗,面试要么是点击就送,要么就是往死里拷打,没有一个统一的标准。这个不能代表所有公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务