2021.5.27,leetcode 每日一题461. 汉明距离
用 python 写出来了
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
a = x^y
a = str(bin(a))
ans = 0
# print(a,type(a))
for ch in a:
if ch=='1':
ans+=1
return ans
看了题解,一行就能搞定了。。。这俩其实都一样。
return bin(x^y).count('1')
return bin(x^y)[2:].count('1')
写 JS 又不会了,于是看了别人的题解:
官方给了两个方法:
- 移位。时间复杂度 O ( l o g C ) O(logC) O(logC);空间复杂度 O ( 1 ) O(1) O(1)
var hammingDistance = function (x, y) {
let s = x ^ y,
ret = 0;
while (s != 0) {
ret += s & 1;
s >>= 1;
}
return ret;
};
- Brain Kernighan 算法。时间复杂度 O ( l o g C ) O(logC) O(logC);空间复杂度 O ( 1 ) O(1) O(1)
var hammingDistance = function (x, y) {
let s = x ^ y,
ret = 0;
while (s != 0) {
s &= s - 1;
ret++;
}
return ret;
};
然后又发现了用一行就能解决的解法:原文链接
解题思路:
- 第一种: 转换为二进制字符串后再次转换为 array,通过 reduce 累计 1 的数量
- 第二种: 转换为二进制字符串后再次转换为 array,通过 filter 过滤 1 ,最后返回数组长度
var hammingDistance = function (x, y) {
return (x ^ y).toString(2).split("").reduce((count, b) => (b === "1" ? count + 1 : count), 0);
};
var hammingDistance = function (x, y) {
return (x ^ y).toString(2).split("").filter((b) => b === "1").length;
};