LeetCode刷题笔记(Hamming Distance)

笔者刚又挑了一道比较简单的题来练练手,下面和大家分享一下经验吧!

题目如下:

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);
    }
};

提交后的结果如下: 

 

 

 

日积月累,与君共进,增增小结,未完待续。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值