weekly contest 426。 python 神題。

題目

輸入正整數 n。

找到最小的數 x,滿足 x 大於等於 n,且其二進制表示中只有設置位 (1 位元)。

解法

暴力構造所有都是 1 位元組成的數字,直到大於等於 n 為止。

時間複雜度 O(log n)。
空間複雜度 O(1)。

class Solution:
    def smallestNumber(self, n: int) -> int:
        x = 1
        while x < n:
            x = (x << 1) | 1

        return x

其實相當於把 n 個每個位都改成 1。
直接構造出和 n 的二進制長度相同的數即可。

時間複雜度 O(1)。
空間複雜度 O(1)。

class Solution:
    def smallestNumber(self, n: int) -> int:
        return (1 << n.bit_length()) - 1