博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Bitwise AND of Numbers Range 数字范围位相与
阅读量:7280 次
发布时间:2019-06-30

本文共 1635 字,大约阅读时间需要 5 分钟。

 

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

For example, given the range [5, 7], you should return 4.

Credits:

Special thanks to  for adding this problem and creating all test cases.

 

又是一道考察位操作Bit Operation的题,相似的题目在LeetCode中还真不少,比如,,   ,,和 等等,那么这道题其实并不难,我们先从题目中给的例子来分析,[5, 7]里共有三个数字,分别写出它们的二进制为:

101  110  111

相与后的结果为100,仔细观察我们可以得出,最后的数是该数字范围内所有的数的左边共同的部分,如果上面那个例子不太明显,我们再来看一个范围[26, 30],它们的二进制如下:

11010  11011  11100  11101  11110

发现了规律后,我们只要写代码找到左边公共的部分即可,我们可以从建立一个32位都是1的mask,然后每次向左移一位,比较m和n是否相同,不同再继续左移一位,直至相同,然后把m和mask相与就是最终结果,代码如下:

 

解法一:

class Solution {public:    int rangeBitwiseAnd(int m, int n) {        int d = INT_MAX;        while ((m & d) != (n & d)) {            d <<= 1;        }        return m & d;    }};

 

此题还有另一种解法,不需要用mask,直接平移m和n,每次向右移一位,直到m和n相等,记录下所有平移的次数i,然后再把m左移i位即为最终结果,代码如下:

 

解法二:

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

 

下面这种方法有点叼,就一行搞定了,通过递归来做的,如果n大于m,那么就对m和n分别除以2,并且调用递归函数,对结果再乘以2,一定要乘回来,不然就不对了,就举一个最简单的例子,m = 10, n = 11,注意这里是二进制表示的,然后各自除以2,都变成了1,调用递归返回1,这时候要乘以2,才能变回10,参见代码如下:

 

解法三:

class Solution {public:    int rangeBitwiseAnd(int m, int n) {        return (n > m) ? (rangeBitwiseAnd(m / 2, n / 2) << 1) : m;    }};

 

下面这种方法也不错,也很简单,如果m小于n就进行循环,n与上n-1,那么为什么要这样与呢,举个简单的例子呗,110与上(110-1),得到100,这不就相当于去掉最低位的1么,n就这样每次去掉最低位的1,如果小于等于m了,返回此时的n即可,参见代码如下:

 

解法四:

class Solution {public:    int rangeBitwiseAnd(int m, int n) {        while (m < n) n &= (n - 1);        return n;    }};

 

参考资料:

 

转载地址:http://hmzjm.baihongyu.com/

你可能感兴趣的文章
吴恩达机器学习笔记-神经网络的代价函数和反向传播算法
查看>>
前后端的分离模式
查看>>
Yii2开发技巧 使用类似闭包的方式封装事务
查看>>
k8s与数据分析--利用redash做自助数据分析
查看>>
移动APP开发中8大安全问题
查看>>
ElementUI中tree控件踩坑记
查看>>
自定义jquery插件
查看>>
游戏AI(二)—行为树优化之内存优化
查看>>
Mozilla网站安全分析工具Observatory已发布
查看>>
.NET Core 2.1改进了性能,并提供了新的部署选项
查看>>
AWS推出RoboMaker,可构建智能机器人应用程序
查看>>
1100名达摩院“扫地僧”加持,阿里云的下一个十年
查看>>
取代ZooKeeper!高并发下的分布式一致性开源组件StateSynchronizer
查看>>
《Elasticsearch in Action》书评与作者访谈
查看>>
腾讯云发布CDN 2.0,四大优势加速移动化进程
查看>>
Visual Studio 2017 15.6预览版最新进展
查看>>
ZenHub Epics创造了GitHub中敏捷Epics
查看>>
《七周七并发模型》作者Paul Butcher、阿里云研究员余锋(褚霸)——QCon北京2016前瞻...
查看>>
iOS应用开发登陆Windows平台惹争议
查看>>
《Java 20年:道路与梦想》迷你书发布
查看>>