文章

477.汉明距离总和

477.汉明距离总和

题目

原题 477.汉明距离总和

题解

直接使用暴力方法计算 total hamming distance 会超时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
    public int totalHammingDistance(int[] nums) {
        int res =0;
        for (int left =0; left< nums.length; left++){
            for (int right = left+1; right<nums.length; right++){
                res += hammingDistance(nums[left], nums[right]);
            }
        }
        return res;
    }
    
    public int hammingDistance(int left, int right){
        int xor = left^right;
        int res =0;
        while (xor!=0){
            if ((xor&1)==1){
                res++;
            }
            xor >>=1;
        }
        return res;
    }
}

实际上题目中给出了提示,每个整数都是 32 bit,可以依次统计每一个 bit 位置上的 hamming distance,最终将它们加和作为最终结果。 假设考虑 i 位置的 bit,可以统计出来有多少数字在这个位置上是 1 (count_1),剩下的就都是 0 (count_0),下面是 i 位置的 hamming distance:

1
sum_distance[i] = count_1 * count_0

下面是改进之后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
    public int totalHammingDistance(int[] nums) {
        int res =0;
        for (int bitIdx =0; bitIdx<32; bitIdx++){
            int bit = 1<<bitIdx;
            int one = 0;
            for (int num: nums){
                if ((num&bit)!=0){
                    one++;
                }
            }
            res+=(one * (nums.length-one));
        }
        return res;
    }
}
本文由作者按照 CC BY 4.0 进行授权