LeetCode——477. 汉明距离总和[Total Hamming Distance][中等]——分析及代码[Java]
一、题目
两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。
计算一个数组中,任意两个数之间汉明距离的总和。
示例:
输入: 4, 14, 2
输出: 6
解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)
所以答案为:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
注意:
- 数组中元素的范围为从 0到 10^9。
- 数组的长度不超过 10^4。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/total-hamming-distance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 逐位计算
(1)思路
二进制各个位产生的汉明距离相互独立,因此可逐位计算。每个数位产生的汉明距离 = 所有数字在该数位 0 的个数 * 1 的个数。
(2)代码
class Solution {
public int totalHammingDistance(int[] nums) {
int n = nums.length, ans = 0;
//统计各数位的数字和
int[] digit = new int[30];
for (int num : nums) {
int i = 0;
while (num > 0) {
digit[i++] += num & 1;
num >>= 1;
}
}
//各数位产生的汉明距离 = 0的个数 * 1的个数
for (int i = 0; i < 30; i++)
ans += digit[i] * (n - digit[i]);
return ans;
}
}
(3)结果
执行用时 :7 ms,在所有 Java 提交中击败了 82.25% 的用户;
内存消耗 :39 MB,在所有 Java 提交中击败了 96.64% 的用户。
三、其他
暂无。