201 Bitwise AND of Numbers Range
来源:互联网 发布:软件项目风险评估报告 编辑:程序博客网 时间:2024/06/09 17:05
201 Bitwise AND of Numbers Range
连接:https://leetcode.com/problems/bitwise-and-of-numbers-range/
题目描述:
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 @amrsaqr for adding this problem and creating all test cases.
这个问题是计算m到n之间所有连续数字的按位与的结果。暴力做法是写个for循环,让所有数字做与操作就可以得到正确结果。但这样做存在的问题是会耗费大量的时间。虽然没有做测试,但是会因为时间超过限制而无法AC。做一下简单分析,假设在二进制表示中n的位数(k1)比m的位数(k2)长,即k1>k2,那么结果一定会是0,因为在m增长到n的过程中肯定会出现10000…(k1个0)这个数,这个数和n做与操作结果就是0。比如m=1011,n=10001,那么n&10000=0,所以结果一定为0。那么还剩下n和m长度一样的情况。从高位开始分析,因为n>=m,如果这一位上n和m的数字k相同,那么结果中这一位的结果就是k,当m的某一位为0,而n的某一位为1时(一定是这种情况,因为n>=m),运用前面的原理,那么从这一位开始后面就都是0了。比如m=1100 0101,n=1100 1110,那么结果就是1100 0000。
class Solution {public: int rangeBitwiseAnd(int m, int n) { int a[32]; int b[32]; memset(a,0,sizeof(int)*32); memset(b,0,sizeof(int)*32); int index=0; int result=0; while(m&&n) { m&1?a[index]=1:a[index]=0; n&1?b[index]=1:b[index]=0; n=n>>1; m=m>>1; if(m==0&&n!=0) return 0; index++; } index--; while((a[index]==b[index])&&index>=0) { result+=a[index]<<index; index--; } return result; }};