前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode477. Total Hamming Distance

leetcode477. Total Hamming Distance

作者头像
眯眯眼的猫头鹰
发布2019-10-08 18:51:22
3280
发布2019-10-08 18:51:22
举报

题目要求

代码语言:javascript
复制
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, 2

Output: 6

Explanation: In binary representation, the 4 is 0100, 14 is 1110, and 2 is 0010 (just
showing 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:
1. Elements of the given array are in the range of 0 to 10^9
2. Length of the array will not exceed 10^4.

计算N个数字之间的汉明码距离之和。 汉明码是指两个数字的二进制表示形式中,在对应位置上值不同的数量总和。如2和4,4的二进制表达式为100, 2的二进制表达式010,则二者在第二位和第三位的值不同,因此汉明码值为2。

思路和代码

如果直观的采用两两比较来得出任意两个数字之间的汉明码值,再将汉明码值的和进行累加,得出最终的汉明码值总和,则需要O(n^2)的时间复杂度。除此以外,还要乘上数字二进制的平均长度。

那么有没有方法能够尽可能的减少重复比较的场景。既然水平的以两个数字直接开始比较会超时,不如垂直的进行比较,即每次都比较同一位置上的所有二进制数值,假设一共有n个数字,其中有m个数字在第i上值为1,则剩下的n-m个数字在第i上的值为0。由此可知,在第i为上存在的(m-n)*n个数值不同的情况。对32位整数重复执行这个过程并累加即可得出最终的汉明码和。

代码如下:

代码语言:javascript
复制
    public int totalHammingDistance(int[] nums) {
         int count = 0;
         int length = nums.length;
         for(int i = 0 ; i<32 ; i++) {
               int countOfOne = 0;
               for(int j = 0 ; j < length ; j++) {
                   countOfOne += (nums[j] >> i) & 1;
               }
               count += countOfOne * (length - countOfOne);
         } 
         return count;
     }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目要求
  • 思路和代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档