201. Bitwise AND of Numbers Range
来源:互联网 发布:pdf格式软件下载 编辑:程序博客网 时间:2024/05/29 11:02
题目:数字范围位相与
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.
题意:
给定一个范围[m,n],0 <= m <= n <= 2147483647,返回这个范围内所有数字相与之后的结果。
转载:http://www.cnblogs.com/grandyang/p/4431646.html
思路一:
从题目中给的例子来分析,[5, 7]里共有三个数字,分别写出它们的二进制为:
101 110 111
相与后的结果为100,仔细观察我们可以得出,最后的数是该数字范围内所有的数的左边共同的部分,如果上面那个例子不太明显,我们再来看一个范围[26, 30],它们的二进制如下:
11010 11011 11100 11101 11110
发现了规律后,我们只要写代码找到左边公共的部分即可,我们可以从建立一个32位都是1的mask,然后每次向左移一位,比较m和n是否相同,不同再继续左移一位,直至相同,然后把m和mask相与就是最终结果。
代码:C++版:64ms
class Solution {public: int rangeBitwiseAnd(int m, int n) { int d = INT_MAX; while ((m & d) != (n & d)) { d <<= 1; //左移一位,右边补0,清除掉m和n不相同的位,相同的位依然为1 } return m & d; //d中为1的位表示m和n中都同时为1的位 }};
思路二:
另一种解法,不需要用mask,直接平移m和n,每次向右移一位,直到m和n相等,记录下所有平移的次数i,然后再把m左移i位即为最终结果。
代码:C++版:68ms
class Solution {public: int rangeBitwiseAnd(int m, int n) { int i = 0; while (m != n) { m >>= 1; n >>= 1; ++i; } return (m << i); }};
思路三:
递归实现,观察如上规律可得,如果m < n,那么返回数字的最低位一定是0,所以可以将该问题转换为如下子问题:rangeBitwiseAnd(m>>1, n>>1)。
代码:C++版:72ms
class Solution {public: int rangeBitwiseAnd(int m, int n) { return (n > m) ? (rangeBitwiseAnd(m/2, n/2) << 1) : m; }};
- iOS 第三方框架 - CocoaPods的安装、使用、原理
- STM32串口1发送,串口2接收
- 线性表的基本操作:插入、删除、查找等操作在顺序存储结构和链接存储结构上的算法及其实现方法。 2006-05-05 10:32:58
- BBC news reading 1
- Android Wifi简单管理与操作
- 201. Bitwise AND of Numbers Range
- Linux学习之路(三)
- ida配合windbg调试程序
- uva 11525 Permutation
- Solr调研总结
- 支付宝前端架构专家梁文森(绝云)与你探讨算法与数据结构
- 字符串的startsWith和endWith方法
- python数据预处理练习
- Hadoop2.2集群搭建(1)