Leetcode: 数字范围的按位与(Bitwise AND of Numbers Range)(C++)

17 篇文章 0 订阅
17 篇文章 0 订阅

Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.

Example 1:

Input: [5,7]
Output: 4

Example 2:

Input: [0,1]
Output: 0

给定范围[m,n],其中0 <= m <= n <= 2147483647,返回此范围内(包括两端)的所有数字的按位与。


这题很明显是道数学题,优化算法就必须要从数学入手。

首先我们研究下与操作,所谓与操作就是只有1和1才能得1。我们把第一个例子化为2进制

0111 7

0110 6

0101 5

————

0100 4

从这里我们可以看出只要某一位中出现一个0,那么这一位必为0.而除去最大和最小的数字以外,中间的数字总会扰乱最大最小数字的最后几位,举个例子,17(1 0001)到31(1 1111)之间会出现很多数字,它们变化的位数是1-4位。但是我们不需要去研究中间的数字,我们只要知道17到31的所有数字的第5位是从来不变的,所以说我们只要研究最大和最小的数字的从左到右数哪几位是相同的,这几个相同的就是他们以及他们之间数字不变的位数。由此就很容易写出程序来了

可能讲的不清楚,见谅把

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        int pos = 0;
        for(;m >> pos != n >> pos; pos++);
        return m>>pos<<pos;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值