231.2のべき乗(Python)

1631 ワード

タイトル
難易度:★☆☆☆☆タイプ:数学
整数を指定し、関数を作成して2のべき乗次数であるかどうかを判断します.

例1:
入力:1出力:true解釈:2^0=1
例2:
入力:16出力:true解釈:2^4=16
例3:
入力:218出力:false
に答える
これは非常に簡単な数学の問題で、入力数字nが2のべき乗であれば、条件を満たす:nを2で割った余剰数は必ずゼロで、除数は必ず2のべき乗で、私たちはここでそれぞれ反復法と再帰法を使って判断します.
シナリオ1:反復
class Solution(object):
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """
        while n and n != 1:             #  n    n  1 
            r, n = n % 2, n // 2        # n  2       
            if r != 0:                  #        
                return False            #     2  
        return n == 1                   #    2  ,         1

シナリオ2:再帰
class Solution(object):
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """

        if n < 2:                       #       
            return n > 0                #   n     ,  False,n 1,  True
        #       ,    2  ,       2  
        return n % 2 == 0 and self.isPowerOfTwo(n // 2)

再帰は反復より簡潔に見える.
シナリオ3:バイナリ計算
入力数をバイナリに変換し,入力数nが2のべき乗であればnのバイナリ形態では最上位のみが「1」であり,他のビットはいずれも「0」であり,n−1の二次べき乗の最上位は「0」:,他のビットはいずれも「1」であるため,nのバイナリをn−1のバイナリとビット相で得られた結果は必ずゼロである.この原理によれば,入力数字が2のべき乗であるか否かを判断できる.ここで注意しなければならないのは、0は2のべき乗ではないので、入力がゼロでない制限を追加します.
class Solution(object):
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """
        return n and n & (n-1) == 0

質問やアドバイスがあれば、コメントエリアへようこそ~