题目链接: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 {
public:
int 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')
最后想说的是,尽管有很多好的内置函数可以让我们把代码写的很酷,但是我们之所以刷题的目的就在于提高自己的编程思维能力,当然知道更多的内置函数也是一种能力,两者如何取舍,全看自己了。
以上。