461. 汉明距离
注意:
0 ≤ x, y < 2^31.
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
分析:两个整数的汉明距离实际上是这两个数字的二进制数对应位不同的数量。
代码:
public class Test_0202 {
public static void main(String[] args) {
Solution So = new Solution();
int x = 1;
int y = 4;
System.out.println(So.hammingDistance(x, y));
}
}
class Solution {
public int hammingDistance(int x, int y) {
if(x<0 || y<0){
return -1;
}
int HammingDistance = 0;
for(int i=0; i<32; i++){
if(((x>>i & 1) ^ (y>>i & 1)) == 1){
HammingDistance++;
}
}
return HammingDistance;
}
}
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。
分析:由于数组中元素的范围为从 0到 10^9,即二进制不超过30位,计算数组所有数二进制每一位上0和1的个数,而此位对于汉明距离总和的贡献是0的个数乘以1的个数。
代码:
public class Test_0202 {
public static void main(String[] args) {
Solution So = new Solution();
int[] nums = {4, 14, 2};
System.out.println(So.totalHammingDistance(nums));
}
}
class Solution {
public int totalHammingDistance(int[] nums) {
int SumDistance = 0;
for(int k=0; k<30; k++){
int oneCount=0;
for(int i=0; i<nums.length; i++){
if((nums[i]>>k & 1) == 1)
oneCount++;
}
SumDistance += oneCount*(nums.length -oneCount);
}
return SumDistance;
}
}