[LeetCode] 461. 汉明距离 ➕ 191. 位1的个数 ➕ 477. 汉明距离总和

1 题目描述

    1. 汉明距离
      两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。

给出两个整数 x 和 y,计算它们之间的汉明距离。

注意:
0 ≤ x, y < 231.

示例:

输入: x = 1, y = 4

输出: 2

解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑

上面的箭头指出了对应二进制位不同的位置。

    1. 位1的个数
      编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

示例 1:

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。。

    1. 汉明距离总和
      两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。

计算一个数组中,任意两个数之间汉明距离的总和。

示例:

输入: 4, 14, 2

输出: 6

解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)
所以答案为:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.

2 解题思路

    1. 汉明距离
      在这里插入图片描述
      方法一:内置位计数功能
      大多数编程语言中,都存在各种内置计算等于 1 的位数函数。如果这是一个项目中的问题,应该直接使用内置函数,而不是重复造轮子。
      方法二:移位

思路

为了计算等于 1 的位数,可以将每个位移动到最左侧或最右侧,然后检查该位是否为 1。

更准确的说,应该进行逻辑移位,移入零替换丢弃的位。
这里采用右移位,每个位置都会被移动到最右边。移位后检查最右位的位是否为 1 即可。检查最右位是否为 1,可以使用取模运算(i % 2)或者 AND 操作(i & 1),这两个操作都会屏蔽最右位以外的其他位。

    1. 位1的个数
      前面的461题也就已经转换为计算1的个数了,所以说这道题的代码 只需把前面设定的变量xor取消,变成题目中给的那个数n即可
      解题思路100%,相似度➕➕➕
    1. 汉明距离总和
      这道题其实可以分开来算,就是 遍历所有的两两组合,计算汉明距离之和,时间复杂度是 O(n 2 ),,数据量比较庞大,很容易超时。

所以这里采用的解法是:

1.汉明距离总和等于仍以对应位上汉明距离的和
2.对应位汉明距离和 = 对应位为0的个数 * 对应位为1的个数

3 解决代码

    1. 汉明距离 方法一python代码
class Solution:
    def hammingDistance(self, x: int, y: int) -> int:
        return bin(x ^ y).count('1')
    1. 汉明距离 方法一java代码
class Solution {
    public int hammingDistance(int x, int y) {
        return Integer.bitCount(x ^ y); 
    }
}

    1. 汉明距离 方法二python代码
class Solution(object):
    def hammingDistance(self, x, y):
        """
        :type x: int
        :type y: int
        :rtype: int
        """
        xor = x ^ y
        distance = 0
        while xor:
            # mask out the rest bits
            if xor & 1:
                distance += 1
            xor = xor >> 1
        return distance
    1. 汉明距离 方法二java代码
class Solution {
  public int hammingDistance(int x, int y) {
    int xor = x ^ y;
    int distance = 0;
    while (xor != 0) {
      if (xor % 2 == 1)
        distance += 1;
      xor = xor >> 1;
    }
    return distance;
  }
}

    1. 位1的个数 python代码
class Solution(object):
    def hammingWeight(self, n):
        """
        :type n: int
        :rtype: int
        """
        distance = 0
        while(n):
            if n % 2 == 1:
                distance += 1
            n = n >>1
        return distance
    1. 汉明距离总和暴力解法代码(超出时间限制)
class Solution {
    public int totalHammingDistance(int[] nums) {
         int ret = 0, n = nums.length;
        // 遍历所有的两两组合
        for (int i = 0; i < n - 1; i++) {
            for (int j = i + 1; j < n; j++) {
                ret += hammingDistance(nums[i], nums[j]);
            }
        }
        return ret;

    }
   public int hammingDistance(int x, int y)
    {
        int z = (x ^ y);
        int ret = 0;
        while (z != 0) {
            z = (z & (z - 1));
            ret++;
        }
        return ret;
    }
}

运行结果及结果放截图:
在这里插入图片描述

    1. 汉明距离总和正确代码
class Solution {
    public int totalHammingDistance(int[] nums) {
        int[] cnt = new int[32];
        for(int i = 0; i < 32; i++){
            for (int val:nums){
                if((val &(1<<i)) != 0){
                    cnt[i]++;
                }
            }  
        }
        int total = 0;
        for(int i = 0; i< 32; i++){
            total += (cnt[i] *(nums.length- cnt[i]));
        }
        return total;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值