LeetCode-461. Hamming Distance

题目链接:461.Haming Distance


这道题的意思非常简单,给你两个31位的正整数x和y,求出x和y的二进制数一共有多少位不一致。
因为个人原因,我会使用Python语言编程,希望各位看官先看一看是否与自己想找的内容相符,当然编程的本质实际上是一样的,语法问题本来就不是个问题。

此题也给出两种解法:
第一种解法:将两个数转换为二进制数并用list存起来,然后对较小的那个数进行补0操作,这一点很重要,不然两个list的长度不一样的时候就没的玩了,然后按位比较得出结果。
用时:35 ms

class Solution(object):
    def hammingDistance(self, x, y):
        xList = []
        yList = []

        while(x > 0):
            fuck = x % 2
            xList.append(fuck)
            #python的特点 //结果是整数,/是浮点数
            x //= 2

        while(y > 0):
            yList.append(y % 2)
            y //= 2

        if (len(xList) < len(yList)):
            xList += [0] * (len(yList) - len(xList))
        else:
            yList += [0] * (len(xList) - len(yList))

        sum = 0
        for i in range(len(xList)):
            if (xList[i] != yList[i]):
                sum += 1
        return sum

第二种解法:利用位运算,首先得到两个数异或的结果(不懂异或的朋友请自己学习),对这个结果的二进制数的每一位都进行判断,当前位是1则不同,当前位是0,则相同。
用时: 56 ms

class Solution(object):
    def hammingDistance(self, x, y):
        result = x ^ y
        count = 0
        while (result > 0):
            count += result & 1
            result >>= 1

        return count

在这里我很困惑的一点就是为什么第一种解法会比第二种解法用掉更少的时间,这是我一直不太理解的一点,如果有哪位看到这篇博客并且知道为什么的朋友,留言给我,先行谢过。


最后还要说的一点是不同的语言会有不同的解决方法,例如以下

  • java
    java在这个题目里只需要一行代码就可以解决
public class Solution {
    public int hammingDistance(int x, int y) {
        return Integer.bitCount(x ^ y);
    }
}
  • C++
    c++在这里可以实现0ms跑完(亲测3ms)
class Solution { 
publicint hammingDistance(int x,int y){

    int z = x^y;
    int count =0 ; 
    while(z>0){
    if(z%2==1)count++;
    z=z/2;
    }

    return count;
}
};
  • python
    python一行代码的解决方法
class Solution(object):
    def hammingDistance(self, x, y):
        return bin(x ^ y).count('1')

最后想说的是,尽管有很多好的内置函数可以让我们把代码写的很酷,但是我们之所以刷题的目的就在于提高自己的编程思维能力,当然知道更多的内置函数也是一种能力,两者如何取舍,全看自己了。

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值