zoukankan      html  css  js  c++  java
  • 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.

    Analysis: O(N) solution will cause TLE, so this is a math problem and should generate O(1) solution

    First trial: slow.

    Check all 32 bits. see if both m(lower bound) and n(higher bound) are 1 on ith bit. Also need to check if diff=n-m+1 is greater than 2^i, which is the max range that 1 is fixed on this bit.

     1 public class Solution {
     2     public int rangeBitwiseAnd(int m, int n) {
     3         int res = 0;
     4         int diff = n-m+1;
     5         int maxRange = 1;
     6         for (int i=0; i<=31; i++) {
     7             maxRange = (int)Math.pow(2, i);
     8             if (diff > maxRange) continue;
     9             int mi = (m>>i) & 1;
    10             int ni = (n>>i) & 1;
    11             if (mi == 1 && ni == 1) res |= 1<<i; 
    12         }
    13         return res;
    14     }
    15 }

    Better solution: this is actually finding the Shared Header(公共头部)

     1 public class Solution {
     2     public int rangeBitwiseAnd(int m, int n) {
     3         if (m > n) return 0;
     4         int i = 0;
     5         while (m != n && m != 0) {
     6             m = m >> 1;
     7             n = n >> 1;
     8             i++;
     9         }
    10         return m<<i;
    11     }
    12 }
  • 相关阅读:
    Linux从入门到进阶全集——【第十四集:Shell编程】
    cmake 编译 c++ dll 的一个例子
    %1 不是有效的Win32应用程序
    C++ 生成 dll 和调用 dll 的方法实例(转)
    Clion cmake 一个简单的 C++ 程序
    一月4
    一月4日
    1月4日
    一月4日
    一月4日
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5047008.html
Copyright © 2011-2022 走看看