【LeetCode】201. 数字范围按位与(JAVA)

博客围绕LeetCode上数字范围按位与的题目展开。解题方案指出,m和n的最长公共前缀按位与不变,公共前缀后的位在m和n间总会有1000…的数,按位与后会变为0,最终结果是前几位为公共前缀、后几位为0的数,还提到第二种方法特定条件会超时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题地址:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range/

题目描述:
在这里插入图片描述

解题方案:
首先m和n的最长公共前缀按位与是不会发生变化的,会改变的是公共前缀后面的位。而在m和n之间总会有后面位为1000…的一个数,由于这个数的存在,以及后面位为非公共前缀中的位,所以第一位会有1有0,所以后面的位按位作与后都会变为0,即最终结果为前几位为公共前缀,后几位均为0的数。

代码:

class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        int step = 0;
        while(m != n) {
            m = m >>> 1;
            n = n >>> 1;
            step ++;
        }
        for(int i = 0; i < step; i ++)
            m= m << 1;
        return m;
    }
}
class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        while(m < n) {
            n = n & (n - 1);
        }
        return n;
    }
}

PS:第二种方法如果条件为m != n,则会超时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值