Leetcode 477. Total Hamming Distance-java

来源:互联网 发布:php微信二次开发教程 编辑:程序博客网 时间:2024/06/01 10:00

1 解题思想

这道题是计算总汉明距离,题目难度为Medium。

汉明距离是信息论中的重要概念,将两个数字做异或操作,统计结果中1的个数即可得出两者的汉明距离。试了下循环比对时间复杂度O(n^2)的方法,不出意外超时了。

对于所有数字中的某一位,在两两比对时如果两者不同则其为总汉明距离贡献为1,如果相同则贡献为0。这样该位为0的数字和该位为1的数字可分为两个集合,它们互相之间都能为总汉明距离贡献1,而集合内部对总汉明距离没有贡献,因此将该位为0的个数和为1的个数相乘即可得出该位对总汉明距离的贡献。这样遍历整个int的32位即可求出总汉明距离

题目的意思就是给了一个数组,现在求总的海明距离,其中: 
1、海明距离:任意两个数在二级制的表示下(int = 32bit),每个bit对应的值是1或0,那么这两个数在这32个位置下,取值不一样的地方的总和就是海明距离 
2、总的距离:该数组中,所有两两组合得到的元素的海明距离的和

而方法也找到了一个很简单的: 
int长度是32bit,一共n个数 
在每个位置上,如果有k个数为1,那么就有n-k个为0 
那么贡献的海明距离就贡献了 k*(n-k)

2 原题

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.Now your job is to find the total Hamming distance between all pairs of the given numbers.Example:Input: 4, 14, 2Output: 6Explanation: In binary representation, the 4 is 0100, 14 is 1110, and 2 is 0010 (justshowing the four bits relevant in this case). So the answer will be:HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.Note:Elements of the given array are in the range of 0 to 10^9Length of the array will not exceed 10^4.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3 AC解

public class Solution {    /**     *int长度是32bit,一共n个数     * 在每个位置上,如果有k个数为1,那么就有n-k个为0     * 那么贡献的海明距离就贡献了 k*(n-k)     * 0x开头在java中表示16进制数, 0开头的话代表是8进制数,此处也可直接写1     * */    public int totalHammingDistance(int[] nums) {        int total = 0;        int n = nums.length;        for (int i=0;i<32;i++){            int counter = 0;            for ( int j=0;j<n;j++){                counter += (nums[j] >> i) & 0x01;/*也可以这样写int temp = nums[j] >> i;                if((temp&1)!=0){                    counter ++;                }*/            }            total += counter*(n - counter);        }        return total;    }}
0 0