zoukankan      html  css  js  c++  java
  • LeetCode--Bitwise AND of Numbers Range

    LeetCode--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.
    

    题目大意是给定一个范围[m,n],求解m到n进行按位与操作后的结果。

    思路

    按位运算,所有数字自然要按二进制形式表达。一组数字按位与时,只有所有数字这一位上都为1时,结果才会为1。如果m=n,那自然结果就是m.下面讨论m!=n的情况。

    让我们从最低位开始。
    如果这一组数字的最低位不相同的话,那这一位就肯定会被消掉,变成0.如果m!=n,那最低位肯定是要被消掉的,因为最低位肯定会是一个0,一个1.这时,我们可以将m和n都右移一位,将最后一位忽略。

    此时,又有了新的一组m和n。如果此时m=n,那结果就是m了。如果不是的话,那可以继续上一段的过程,将m和n右移一位。

    重复上述操作,直到m=n。这个时候,从低位往高位所有进行与操作后结果为0的位数都已经被消掉,而高位的数字进行与操作不会发生变化,此时的m或者n再向左移动之前移动的位数,得到的就是这一组数字按位与后的结果。

    代码

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

    Java下的算法实现。提交到LeetCode后448ms。同样的逻辑,改用c实现,耗时仅为48ms。

    另一种方式

    当然,我们还可以用其他方式解决这个问题。做题不能仅仅满足与Accepted,而是要深入的理解这一道题,掌握思路从无到有的过程,并且要试着想一下解决问题的其他方式。

    这里的另一种方式,主要用到了n&(n-1)这个式子。初看上去你可能会很迷茫,因为从字面上确实看不出这个式子跟这个题目有什么关系。当然,如果你脑子中二进制各种运算和十进制一样熟悉,那你肯定会知道,这个式子的作用就是消去n的最低位的1。讲解可以看这里

    采用这个式子呢,我们的算法可以简化成以下这个形式:

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

    看上去是不是碉堡了?就这么点代码,却解决了一个看着很棘手的问题。Java耗时368ms,C耗时38s。给C跪了。。。

  • 相关阅读:
    【hdu 2569】ACM程序设计期末考试081230
    【信息安全111班暑期学习工作任务】
    【hdu 1698 Just a Hook(被搞死)】
    Win8下安装 .net framework 3.5.1 无需连网安装方法,证实有效
    【UVA 488 Triangle Wave】
    【As Easy As A+B 专题训练排序】
    【hdu 1787 GCD Again (数论、欧拉函数)】
    【hdu 2602 Bone Collector(动态规划、01背包)】
    【poj 1953 World Cup Noise】
    【poj 2478 Farey Sequence (欧拉函数、数论)】
  • 原文地址:https://www.cnblogs.com/csonezp/p/4587392.html
Copyright © 2011-2022 走看看