201. Bitwise AND of Numbers Range

来源:互联网 发布:2016新鲜网络赚钱项目 编辑:程序博客网 时间:2024/06/04 19:50

201 . Bitwise AND of Numbers Range

Difficulty: Medium

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.

解题思路

可以说刚刚开始的时候的我是看不懂题的。。后来翻译过来看懂了大致意思,其实就是将n到m之间的所有数转换为二进制数之后进行按位的与运算,将所生成的解转换回十进制表示,返回之即可。

最开始的想法很傻很天真,就想着直接将数字都转换为二进制在按位运算,然后发现时间复杂度惨不忍睹(至少是o(n^2)级别),在数值跨度达到2^32级别的空间中,显然是不允许有这么高的复杂度的。于是就要考虑新的方法了。(代码就不贴了。。没有打完就被ban掉了)

后来选择的方法是基于一个运算符“>>”按位右移和“<<”按位左移运算符。并且重新读题可以发现一个思路,应该说是大大提高了效率,就是,如果某一位在n到m的范围中某一个数的这一位是0那么这一位就必定是0了,又因为是二进制数,所以不难得出结论,我们只要匹配n与m的前i位即可,这i位必须满足都为1,只要出现0就不用匹配下去。这个逻辑加上之前的运算符可以得到一个十分简单的函数,时间复杂度只为o(n的位数),非常低,下面是代码展示。

具体实现

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

超级简短~

ps.另外在网上看到一个很好的思路,对于熟练掌握二进制运算想必是有所帮助。利用n&(n-1)来消除n的最后一位1。其实不难想象其原理,但是能想出来确实需要一定的二进制熟练度。代码也很简单:

class Solution {public:    int rangeBitwiseAnd(int m, int n) {        while(n>m)        {            n=n&(n-1);        }        return n;    }};
0 0