477. Total Hamming Distance
leetcode medium
Task
Хэммингово расстояние между двумя целыми числами — это количество позиций, в которых соответствующие биты отличаются.
Дан целочисленный массив nums, верните сумму Хэмминговых расстояний между всеми парами чисел в nums.
Пример:
Input: nums = [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).
The answer will be:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
C# solution
matched/originalpublic class Solution {
public int TotalHammingDistance(int[] nums) {
int ans = 0;
if (nums.Length == 0) {
return ans;
}
for (int i = 0; i < nums.Length - 1; i++) {
for (int j = i + 1; j < nums.Length; j++) {
ans += CountBits(nums[i] ^ nums[j]);
}
}
return ans;
}
private int CountBits(int n) {
int count = 0;
while (n != 0) {
count += n & 1;
n >>= 1;
}
return count;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int TotalHammingDistance(vector<int>& nums) {
int ans = 0;
if (nums.size() == 0) {
return ans;
}
for (int i = 0; i < nums.size() - 1; i++) {
for (int j = i + 1; j < nums.size(); j++) {
ans += CountBits(nums[i] ^ nums[j]);
}
}
return ans;
}
private int CountBits(int n) {
int count = 0;
while (n != 0) {
count += n & 1;
n >>= 1;
}
return count;
}
}Java solution
matched/originalpublic class Solution {
public int totalHammingDistance(int[] nums) {
int ans = 0;
if (nums.length == 0) {
return ans;
}
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
ans += Integer.bitCount(nums[i] ^ nums[j]);
}
}
return ans;
}
}JavaScript solution
matched/originalfunction totalHammingDistance(nums) {
let ans = 0;
if (nums.length === 0) {
return ans;
}
for (let i = 0; i < nums.length - 1; i++) {
for (let j = i + 1; j < nums.length; j++) {
ans += (nums[i] ^ nums[j]).toString(2).split('1').length - 1;
}
}
return ans;
}Python solution
matched/originalclass Solution:
def totalHammingDistance(self, nums):
ans = 0
if not nums:
return ans
for i in range(len(nums) - 1):
for j in range(i + 1, len(nums)):
ans += bin(nums[i] ^ nums[j]).count('1')
return ansGo solution
matched/originalpackage main
func totalHammingDistance(nums []int) int {
ans := 0
if len(nums) == 0 {
return ans
}
for i := 0; i < len(nums)-1; i++ {
for j := i + 1; j < len(nums); j++ {
ans += countBits(nums[i] ^ nums[j])
}
}
return ans
}
func countBits(n int) int {
count := 0
for n > 0 {
count += n & 1
n >>= 1
}
return count
}
func main() {}Explanation
Algorithm
Для каждой уникальной пары элементов из массива вычисляем битовое XOR, чтобы найти позиции, где биты различаются. Бит, равный 1 в результате, указывает на различие.
Для каждой пары элементов используем XOR, чтобы получить битовую разницу, и подсчитываем количество битов, равных 1, чтобы определить Хэммингово расстояние между парой.
Суммируем все Хэмминговы расстояния для всех пар, чтобы получить общую сумму Хэмминговых расстояний.
😎