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;    }};
0 0
原创粉丝点击