校招算法笔面试 | 懂二进制

题目

题目链接

解题思路

这是一道计算两个整数二进制表示中不同位数的题目,主要思路如下:

  1. 问题分析:

    • 给定两个int32整数 m m m n n n
    • 需要计算它们的二进制表示中有多少位不同
    • 例如:3(11)和5(101)有2位不同
  2. 解决方案:

    • 使用异或运算(^)找出不同的位(结果为1的位就是不同的位)
    • 使用Brian Kernighan算法计算1的个数
    • r & ( r − 1 ) r \& (r-1) r&(r1) 可以消除最右边的1
  3. 优化技巧:

    • 不需要实际转换成二进制字符串
    • 使用位运算可以高效计算

代码

class Solution {
public:
    int countBitDiff(int m, int n) {
        // 异或运算找出不同的位
        int r = m ^ n;
        int count = 0;
        
        // Brian Kernighan算法计算1的个数
        while(r) {
            r &= (r - 1);  // 消除最右边的1
            count++;
        }
        
        return count;
    }
};
public class Solution {
    public int countBitDiff(int m, int n) {
        // 异或运算找出不同的位
        int r = m ^ n;
        int count = 0;
        
        // Brian Kernighan算法计算1的个数
        while(r != 0) {
            r &= (r - 1);  // 消除最右边的1
            count++;
        }
        
        return count;
    }
}
class Solution:
    def countBitDiff(self, m: int, n: int) -> int:
        # 异或运算找出不同的位
        r = m ^ n
        count = 0
        
        # Brian Kernighan算法计算1的个数
        while r:
            r &= (r - 1)  # 消除最右边的1
            count += 1
        
        return count

算法及复杂度

  • 算法:Brian Kernighan算法
  • 时间复杂度: O ( k ) \mathcal{O}(k) O(k) - k k k 为二进制中1的个数
  • 空间复杂度: O ( 1 ) \mathcal{O}(1) O(1) - 只需要常数级别的额外空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值