先看题意:
Input: 4,14, 2
Output: 6
Explanation:In binary representation, the 4 is 0100, 14 is 1110, and 2 is 0010 (just
showingthe four bits relevant in this case). So the answer will be:
HammingDistance(4,14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
计算总的hamming距离,根据tips发现规律
0100
1110
0010
两两组合,竖着看,每一列带来的海明距离是(1的个数)*(0的个数)
确定好思路之后,接下来就是写代码了
一开始想的方法也是够笨,直接超时了,用的python
class Solution(object):
def totalHammingDistance(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
total=len(nums)
n=0
count=0
while n<total:
j=n+1
while j<total:
count+= bin(nums[n]^nums[j]).count('1')
j+=1
n+=1
return count
差评
接下来换了换思路
public class Solution {
public int totalHammingDistance(int[] nums) {
int n = nums.length;
int total = 0;
for(int i=0;i<32;i++){
int count = 0;
for(int j=0;j<n;j++){
if((nums[j]&1) ==1){
count +=1;
}
nums[j] >>= 1;
}
total += count*(n-count);
}
return total;
}
}
移位操作和累加操作下面这个更简洁些:
public int totalHammingDistance(int[] nums) {
int total = 0;
int n = nums.length;
for (int i=0;i<32;i++){
int counter = 0;
for ( int j=0;j<n;j++){
counter += (nums[j] >> i) & 0x01;
}
total += counter*(n - counter);
}
return total;
}