【競技プログラミング】「Number Of 1Bits」with Python | LeetCode #191

Python

こちらは「Number Of 1Bits」のPythonによる解答例となっております。この問題は、符号なし整数が与えられたときに、その中に含まれる1の数を返す問題です。

問題

符号なし整数 n が与えられたとき、その中に含まれる1のビット数を返します。

  • 0 <= n <= 2^31 – 1

解法

この問題は、ビット操作を用いたアプローチがあります。ビット演算子 & を使用して、2進数表現での各ビットを検査し、1の数をカウントします。

アルゴリズムの概要を以下に述べます。

  1. カウント用の変数を初期化します。
  2. n が 0 になるまで、n の最後のビットが 1 である場合、カウントをインクリメントします。
  3. n を右にシフトします。

Pythonコード

以下のコードが、「Number of 1 Bits」を解くためのPythonプログラムとなります。

### Function ##################################################################

def solve(num=0):
    
    solver  = Solution().hammingWeight
    
    if 1 <= num <= Input().input: id_LIST = [num]
    else: id_LIST = [id+1 for id in range(Input().input)]
    
    for id in id_LIST:
        data    = Input(id)
        ans     = solver(data.n)
        result  = "OK" if ans==data.ans else "NG"
        print(f"[{str(id).zfill(3)}] {result}")

### Class #####################################################################

class Solution(object):
    def hammingWeight(self, n):
        """
        :type n: int
        :rtype: int
        """
        return bin(n)[2:].count('1')

#==============================================================================

class Input:
    
    def __init__(self, num=0):
        
        if num == 1:
            self.n = int("00000000000000000000000000001011",2)
            self.ans    = 3
        
        elif num == 2:
            self.n = int("00000000000000000000000010000000",2)
            self.ans    = 1

        elif num == 3:
            self.n = int("11111111111111111111111111111101",2)
            self.ans    = 31
        
        else:
            self.input  = 3

### Main ######################################################################

if __name__ == "__main__":

    solve()

###############################################################################