• LeetCode 231 Power of Two


    题目:

    Given an integer, write a function to determine if it is a power of two.

    Example 1:

    Input: 1
    Output: true 
    Explanation: 20 = 1
    

    Example 2:

    Input: 16
    Output: true
    Explanation: 24 = 16

    Example 3:

    Input: 218
    Output: false

    解法:

    判断一个数是不是2的幂,最开始想的是最简单粗暴的解法:

    class Solution {
        public boolean isPowerOfTwo(int n) {
            if(n<=0) return false;
            
            while(n>2)
            {
                if(n%2!=0) return false;
                n /= 2;
            }
            
            return true;
        }
    }

    后来看到Discussion里有一个巧妙的解法:

    class Solution {
        public boolean isPowerOfTwo(int n) {
            
            return n>0 && (n&(n-1))==0;
        }
    }

    至于为什么n和n-1按位与就能得出结论,解释如下:

            首先理解 (n-1)的作用:

            将n的二进制最低位的1改成0。为什么可以将最低位的1改成0?

            注意到,n和n-1仅相差1,假如n的二进制为:******1000    (前面的*为1或0,任意多个,这里的1是n的最低位

            1),那么n-1为:******0111 ,那么n&(n-1):

                                                         

            可以看到,n的二进制最后一位1变成了0。那么,如果n的二进制只有1个,经过n&(n-1)就会变成0。

    这里的解释来自以下原文链接,觉得解释的很到位,就贴了过来。

    原文链接:https://blog.csdn.net/sinat_30071459/java/article/details/51089268

  • 相关阅读:
    poj3635(最短路)
    poj 3041( 最大匹配)
    poj 3522(生成树)
    poj 1904(强连通分量)
    poj 2446(二分匹配)
    poj 2400(最小权匹配)
    poj 2175(费用流消圈)
    poj 1256(搜索)
    poj 2195(最小费用流)
    poj 3613(最短路)
  • 原文地址:https://www.cnblogs.com/trymorel/p/12577937.html
Copyright © 2020-2023  润新知