【LeetCode每日一题】477. 汉明距离总和
题解:
两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。
计算一个数组中,任意两个数之间汉明距离的总和。
示例:
输入: 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。
题目:
从低位开始,计算每一位的1与0各自有多少个,累加求总和。
一种方式是右移一位,直接修改原数,采用&。
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int ans = 0;
for (int i = 0; i < 31; i++) {
int cnt[] = {0, 0};
for (auto& num : nums) {
cnt[num & 1]++;
num >>= 1;
}
ans += cnt[0] * cnt[1];
}
return ans;
}
};
另一种实现方式是不采用&,而是右移位计算。
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int ans = 0;
for (int i = 31; i >= 0; i--) {
int a = 0, b = 0;
for (auto num : nums) {
if ((num >> i) & 1 == 1) a++;
else b++;
}
ans += a * b;
}
return ans;
}
};
本节完
往日题目:
【LeetCode每日一题】1482. 制作 m 束花所需的最少天数