Middle-题目59:201. Bitwise AND of Numbers Range

原创 2016年05月31日 16:30:35

题目原文:
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]内所有整数按位与起来的值。
题目分析:
方法一:(分治法)若存在k∈[0,31],使得m2k<n<2k+1,则返回0,因为[m,n]的二进制数的第k位必定是有0也有1,且第k+1位都是0.而如果2km<n<2k+1,则[m,n]的第k位全是1,那么结果就是2k+[m2k,n2k]区间相与值,这样不断降低问题规模,最终会只剩1-2个数,(因为终究会跟2比一次),直接返回m&n即可。
方法二:(基于位运算,来自http://blog.csdn.net/xudli/article/details/45912649博客)归根结底本题要求的是m和n二进制数的公共前缀,所以先按位右移,记录下移动位数,再按位左移回去即为所求。
源码:(language:java)
方法一:

public class Solution {
    private static int[] pows = new int[]{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824}; 
    public static int rangeBitwiseAnd(int m, int n) {
        if(m>pows[30])
            return pows[30] + rangeBitwiseAnd(m-pows[30],n-pows[30]);
        for(int i = 1;i < 31; i++) {
            if(m<pows[i] && n>pows[i])
                return 0;
            else if(m>=pows[i] && n<pows[i+1])
                return pows[i] + rangeBitwiseAnd(m-pows[i],n-pows[i]);
        }
        return m&n;
    }
}

方法二:

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

成绩:
都是9ms,beats 19.89%,众数9ms,42.27%
Cmershen的碎碎念:
第二种想法十分巧妙也容易理解,但第一种想法更为朴素。

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

leetcode 201: Bitwise AND of Numbers Range

leetcode 201: Bitwise AND of Numbers Range java c++ python
  • xudli
  • xudli
  • 2015年05月22日 08:30
  • 4289

201. Bitwise AND of Numbers Range**

Given a range [m, n] where 0 For example, given the range [5, 7], you should return 4. public...
  • alwaystry
  • alwaystry
  • 2017年02月26日 14:22
  • 115

201. Bitwise AND of Numbers Range

Given a range [m, n] where 0 For example, given the range [5, 7], you should return 4. Credits: S...
  • zhouyanz
  • zhouyanz
  • 2016年03月21日 11:17
  • 120

LeetCode - 201. Bitwise AND of Numbers Range

首先我们要明白的一点是二进制表示的奇数和偶数的AND操作最后一位一定是0,而如果m = n。当m >= n的时候,m和n之间不再有一个奇数和一个偶数,所以这时候我们就初步得到了答案,又因为在寻找这一步...
  • shenzhu0127
  • shenzhu0127
  • 2016年07月19日 18:15
  • 124

【leetcode】201. Bitwise AND of Numbers Range

leetcode, bitwise and of numbers.
  • zone_programming
  • zone_programming
  • 2015年11月12日 20:30
  • 231

LeetCode *** 201. Bitwise AND of Numbers Range

题目: Given a range [m, n] where 0 For example, given the range [5, 7], you should return 4. ...
  • treeshy
  • treeshy
  • 2016年04月16日 09:28
  • 124

201. Bitwise AND of Numbers Range(unsolved)

Given a range [m, n] where 0
  • gdmmzmj
  • gdmmzmj
  • 2017年04月09日 21:22
  • 84

LeetCode 201. Bitwise AND of Numbers Range

可通过的代码: class Solution { public: int rangeBitwiseAnd(int m, int n) { int ret = 0; ...
  • u014674776
  • u014674776
  • 2015年06月19日 10:00
  • 648

【Leetcode】201. Bitwise AND of Numbers Range

Total Accepted: 42844Total Submissions: 132439Difficulty: Medium Given a range [m, n] where 0...
  • z49434574
  • z49434574
  • 2016年09月19日 23:01
  • 282

201. Bitwise AND of Numbers Range LeetCode

题意:求m到n的与之和。 题解:肯定不能一个一个去与运算,想一想可以发现,m和n的表示成二进制的时候,只有他们两个的公共前缀的部分不会改变,后面不同的位置都会在某一时刻与0相与,所以最后与的值一定是...
  • youthinkwu
  • youthinkwu
  • 2016年03月07日 22:25
  • 134
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目59:201. Bitwise AND of Numbers Range
举报原因:
原因补充:

(最多只允许输入30个字)