描述
1、海明距离:两个数化成二进制,计算各位的不同的数目。
2、问题要求n个数两两之间的海明距离
思路
- 初步想法:写一个函数计算两个数之间的海明距离,再求n个数,时间复杂度为O(N^2*M),慢的要死
- 进一步想法:统计每个数尾数为0和1的个数,迭代至最长长度。sum=sum+number0*number1;
我的解法
简单粗暴 (* ̄ω ̄)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int maxlen = 0;
int nNums = nums.size();
for (auto num : nums) {
if (maxlen < getLen(num)) { maxlen = getLen(num); }
}
int haiming_sum = 0;
for (int i = 0; i < maxlen; i++) {
int count01[2] = { 0 };
for (int j = 0; j < nNums; j++) {
int lastnum = nums[j] % 2;
nums[j] /= 2;
if (lastnum == 0) { count01[0]++; }
if (lastnum == 1) { count01[1]++; }
}
haiming_sum += count01[0] * count01[1];
}
return haiming_sum;
}
int getLen(int num) {
int lenNum = 0;
while (num != 0) {
lenNum++;
num /= 2;
}
return lenNum;
}
};
更好的解法
采用了位运算,很快,很短 ~( ̄▽ ̄~)(~ ̄▽ ̄)~
还省去了计算最大长度,不计算0的个数,直接减,厉害啊!老哥。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int total_cnt = 0;
for(int i=0;i<32;i++){
int loc_cnt = 0;
for(int j=0;j<nums.size();j++){
loc_cnt += (nums[j]>>i & 1);
}
total_cnt += loc_cnt*(nums.size()-loc_cnt);
}
return total_cnt;
}
};
**参考资料**
[原题链接](https://leetcode.com/submissions/detail/175053103/)