zoukankan      html  css  js  c++  java
  • Leetcode Tags(13)Bit Manipulation

      一、477.汉明距离总和

    输入: 4, 14, 2
    输出: 6
    解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)
    HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.

      1.常规做法,Time Limit Exceeded

        public int totalHammingDistance(int[] nums) {
            int sum = 0;
            int xor = 0;
            for (int i = 0; i < nums.length; i++) {
                for (int j = i + 1; j < nums.length; j++) {
                    xor = nums[i] ^ nums[j];
                    while (xor != 0 ) {
                        if ((xor & 1) == 1) sum++;
                        xor = xor >> 1;
                    }
                }
            }
            return sum;
        }

      2.更快的做法

    public int totalHammingDistance(int[] nums) {
        int total = 0, n = nums.length;
        for (int j=0;j<32;j++) {
            int bitCount = 0;
            for (int i=0;i<n;i++) 
                bitCount += (nums[i] >> j) & 1;
            total += bitCount*(n - bitCount);
        }
        return total;
    }

      这是因为:

    假设4,14,2,则
    0 1 0 0
    1 1 1 0
    0 0 1 0
    那么,从第4列开始看,1在的位数为0
    第3列1的位数为2:2 *(3-2)
    第2列1的位数为2:2 *(3-2)
    第1列1的位数为1:1 *(3-1)
    也就是说,如果有bitcount个1,n-bitcount个0,那么这bitcount个1分别和n-bitcount个0搭配都能成为1和0,也就是bitcount * (n-bitcount)个
  • 相关阅读:
    【Lintcode】91 最小调整代价
    【LintCode】29 交叉字符串
    十二、动态规划
    HttpClient的简单使用
    ajax跨域请求
    session共享
    八大排序算法
    MAC 脚本批量启动应用
    知识点整理-bio、nio的简单demo
    知识点整理-数组如何实现随机访问?
  • 原文地址:https://www.cnblogs.com/BigJunOba/p/9613237.html
Copyright © 2011-2022 走看看