LeetCode(201) Bitwise AND of Numbers Range
2015-11-20 13:50
281 查看
题目
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.
分析
题目字面意思是给定两个整数构成闭区间, 0 <= m <= n <= 2147483647 均为合法整数,求区间内所有整数的位与结果。看起来是一个很简单的题目,我们可以直接一次遍历得到结果,复杂度为O(n),意料之中的超时。。。
那么,换一种方法,可不可以采用递归呢? 两段分别求出结果,然后相与得到最终结果,遗憾的是再次TLE。。。
看来,不能简单的想当然解题,不妨写出每个整数的二进制表示分析一下:
5 0101
6 0110
7 0111
&
0100
有什么规律呢,我们可以看出结果中的“1”是所有数字的所共有的位;这样就有高效的解法了,我们可以利用移位的规则,将数字相异的位右移掉,记录需要移位的个数。
详细代码见下节。
AC代码
class Solution { public: //方法一,一次遍历 TLE int rangeBitwiseAnd1(int m, int n) { int ret = m; for (int i = m+1; i <= n; ++i) { ret = ret & i; }//for return ret; } //方法二,采用递归,TLE again! int rangeBitwiseAnd2(int m, int n) { if (m == n) return m; int mid = (m + n) / 2; return rangeBitwiseAnd(m, mid) & rangeBitwiseAnd(mid + 1, n); } //方法三: int rangeBitwiseAnd(int m, int n) { int offset = 0; while (m && n) { //找到最高相同位 if (m == n) { return m << offset; } m >>= 1; n >>= 1; offset++; } return 0; } };
GitHub测试程序源码
相关文章推荐
- Python 实现单向链表
- JS,Jquery获取各种屏幕的宽度和高度
- DynamicLoadApk 源码解析 http://codekk.com/open-source-project-analysis
- LeetCode(201) Bitwise AND of Numbers Range
- Ajax入门篇(一),请求类型get&&post的区别
- mass collection
- struts2中JSP无法用<jsp:forward page="test.action"> 跳转到对应的 action中解决方法
- 360加固之libjiagu.so dump修复
- QQ与我联系
- 表格行上下移动效果
- 分享插件
- 支付宝接口
- (转)Android如何编程设置APP安装位置(外部存储或内部存储)?
- Redis_Jedis使用总结
- 关于常用的Lambda(拉姆达)表达式
- oracle使用UTL_MAIL包实现存储过程邮件发送(转)
- ionic ion-refresher 下拉刷新的使用。
- 【Win10】UAP/UWP (通用程序) 开发初体验(1) 之 开发准备
- oracle使用UTL_MAIL包实现存储过程邮件发送(转)
- Eclipse获取android更新信息失败的解决问题(换代理服务器)