🐙

NeetCode 150 [Bit Manipulation]:easy 1/2

2025/02/24に公開

NeetCodeのSolutionを書いていく

Single Number

問題概要

空ではない整数の配列numsが与えられる。
1つを除き、2度出現します。
1つしかない整数を返せ。

計算量:O(n)
メモリ:O(1)

メモ

Setにしても意味ないか。
重複していないものだけをメモリO(1)で取り出すには・・・?
複数回出現する場合は必ず2なのがポイントか?

setにして2回引いて、マイナスかければ行けるか。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        sum_list = sum(nums)

        nums_set = set(nums)
        sum_set = sum(nums_set)

        return -(sum_list - sum_set - sum_set)

OKいけた!
あー。これだとメモリがO(1)じゃないからだめなんか。
わかりやすくていいと思ったけど。

やらせたかったのはこれらしい。XORビット演算で同じものは打ち消し合わせる。その結果1回だけのやつだけ残る。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        res = 0
        for num in nums:
            res = num ^ res
        return res

Number of 1 Bits

問題概要

正の整数nが与えられます。
バイナリ表現にした時に1の数を返しなさい。

計算量:指定なし
メモリ:指定なし

メモ

単純にモジュロ演算と2で割るのを繰り返せばいいのでは?

class Solution:
    def hammingWeight(self, n: int) -> int:
        retval = 0
        while n != 0:
            retval += n % 2
            n //= 2
        return retval

行けた。けど何だこの問題。
簡単すぎというか。何を問うているのか・・・?

解法は以下。
なるほどビット演算を使うことを求めているんですね。
C++を使っている頃はよくビット演算していたけど、pythonを使うようになってめっきり。。。

class Solution:
    def hammingWeight(self, n: int) -> int:
        res = 0
        for i in range(32):
            if (1 << i) & n:
                res += 1
        return res

Discussion