Hamming Distance
一、題目
兩個整數的漢明距離指的是這兩個數字的二進位制數對應位不同的數量。
計算一個數組中,任意兩個數之間漢明距離的總和。
例:
輸入: 4, 14, 2
輸出: 6
解釋: 在二進位制表示中,4表示為0100,14表示為1110,2表示為0010。
所以答案為:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
二、分析
以三個數為例:
a
=
1
0
1
1
b
=
1
1
0
1
c
=
0
0
0
1
a = 1\quad 0\quad 1\quad 1\\ b=1\quad 1\quad 0\quad 1\\ c=0\quad 0\quad 0\quad 1\\
從右到左第一位是三個
1
1
1,所以任意兩個數之間在該位上的漢明距離為0.
從右到左第二位是
1
,
0
,
0
1,0,0
1,0,0,所以
a
,
b
,
c
a,b,c
a,b,c三者之間在該位上的漢明距離之和為
1
×
2
=
2
1\times2=2
1×2=2.(因為只有
1
1
1和
0
0
0之間才有漢明距離。
1
×
2
=
2
1\times2=2
1×2=2表示
1
1
1個
1
1
1和
2
2
2個
0
0
0)
從右到左第三位是
0
,
1
,
0
0,1,0
0,1,0,所以
a
,
b
,
c
a,b,c
a,b,c三者之間在該位上的漢明距離之和為
1
×
2
=
2
1\times2=2
從右到左第四位是
1
,
1
,
0
1,1,0
1,1,0,所以
a
,
b
,
c
a,b,c
a,b,c三者之間在該位上的漢明距離之和為
2
×
1
=
2
2\times1=2
2×1=2.
因此,總的漢明距離為 2 + 2 + 2 = 6 2+2+2=6 2+2+2=6.
因此,對於
n
n
n個數
a
1
,
a
2
,
…
,
a
n
a_1,a_2,\dots,a_n
a1,a2,…,an,(假定都為
32
32
32位整數),其每一位的Hamming distance均為該位上
1
1
1的數量和
0
0
0的數量的乘積。然後將
32
32
三、程式碼
int totalHammingDistance(vector<int>& nums) {
int n = nums.size();
int res = 0;
for(int i = 0; i < 31; ++i){
int cnt[2] = {0, 0};
for(int j = 0; j < n; ++j){
cnt[nums[j] & 1]++;
nums[j] >>= 1;
}
res += (cnt[0] * cnt[1]);
}
return res;
}
tip:如果用暴力破解必定TLE。