笔者刚又挑了一道比较简单的题来练练手,下面和大家分享一下经验吧!
题目如下:
The Hamming distance between two integers is the number of positions at which the corresponding bits are different.
Given two integers x and y, calculate the Hamming distance.
Note:
0 ≤ x, y < 231.
Example:
Input: x = 1, y = 4
Output: 2
Explanation:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
The above arrows point to positions where the corresponding bits are different.
题意分析:
由题意可以,求两个数字之间的汉明距离,就是求它们二进制数对应位不同的个数。
方法一(异或法)
先通过按位与操作,分别将x与y对应的二进制数每一位取出并用异或进行比较,相同为0,不同为1,同时用res去记录异或后1的个数,最后返回res即可。
解题代码如下:
class Solution{
public:
int hammingDistance(int x, int y){
int res = 0;
for (int i = 0; i < 32; i++) {
//&按位与操作,1 << i(表示将1左移1位)用于遍历二进制位
if ((x & (1 << i)) ^ (y & (1 << i)))
res++;
}
return res;
}
};
提交后的结果如下:
方法二(递归法)
递归终止条件:x与y按位异或的结果为0(说明此时x与y两数是一样的),则返回0。当不满足递归终止条件时,则将x与y按位异或的结果对2取余(目的在于判断x与y的最低位是否一样),余数为1则说明最低位不一样,然后再对x/2,y/2(目的在于将x与y右移一位,方便继续判断最低位是否一样)进行递归调用,最后将余数结果与x、y右移后的递归调用结果累加并返回即可。
解题代码如下:
class Solution{
public:
int hammingDistance(int x, int y){
if((x^y) == 0) return 0;
return (x^y) % 2 + hammingDistance(x/2, y/2);
}
};
提交后的结果如下:
日积月累,与君共进,增增小结,未完待续。