1. 程式人生 > 其它 >【位運算】力扣342:4的冪

【位運算】力扣342:4的冪

給定一個整數,寫一個函式來判斷它是否是 4 的冪次方。如果是,返回 true ;否則,返回 false 。
整數 n 是 4 的冪次方需滿足:存在整數 x 使得 n == 4^x。
提示:\(-2^{31} <= n <= 2^{31} - 1\)
示例:

輸入:n = 16
輸出:true

方法1:迴圈

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        if n < 1: # 負數和0都不是4的冪
            return False
        while n != 1:
            if n % 4 != 0:
                return False
            n //= 4
        return True

方法2:遞迴
建立在方法1的基礎上

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        if n < 1:
            return False
        elif n == 1:
            return True
        elif n % 4 != 0:
            return False
        return self.isPowerOfFour(n//4)

因為4是2的冪,所以可以從二進位制角度考慮:
思路1:考慮二進位制表示中 1 和 0 的個數


4的冪必須滿足:二進位制中的 1 只有一個,並且 0 的個數是2的倍數,即:bin(n).count('1') == 1 and bin(n).count('0') % 2 == 1
由於二進位制有字首標識是 0b,所以結果 0 的個數會多一個標識 0,那麼 0 的個數必須是奇數。例如:

n = 4
m = bin(n)
print(m, m.count('0'))

>> 0b100 3

那麼程式碼為

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return bin(n).count('0') % 2 == 1 and bin(n).count('1') == 1 if n > 0 else False

思路2:先考慮 2 的冪
如果 n 是 4 的冪,那麼 n 一定也是 2 的冪。因此可以首先判斷 n 是否是 2 的冪,在此基礎上再判斷 n 是否是 4 的冪。
首先考慮一個數字是不是 2 的(整數)次方:如果一個正整數 n 是 2 的整數次方,那麼它的二進位制一定是 0...010...0(共32位) 這樣的形式;考慮到 n − 1 的二進位制是 0...001...1,這兩個數求【按位與】的結果一定是 0。因此如果 n & (n - 1) 為 0,那麼這個數是 2 的次方。
∴ 判斷一個數 n 是否是 2 的冪的一種方法是:判斷 n > 0 and (n & (n - 1)) == 0 的bool是否為true
方法4:考慮二進位制表示中 1 的位置
如果這個數也是 4 的次方,那二進位制表示中只有一個1,而且 1 的位置必須在奇數位。

  • 可以把 n 和二進位制的 0b010101...10(所有偶數為為1,即十六進位制下的0xaaaaaaaa)做按位與,如果結果為0,那麼說明這個數是4的次方。
  • 可以把 n 和二進位制的 0b10101...101(所有奇數位為1,即十進位制下的 1431655765,十六進位制下的 0x55555555)做按位與,如果結果不為 0,那麼說明這個數是 4 的次方。
  1. 與所有偶數位為1的二進位制數按位與
class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return n > 0 and (n & (n - 1)) == 0 and (n & 0xaaaaaaaa) == 0
  1. 與所有奇數位為1的二進位制數按位與
class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return n > 0 and (n & (n - 1)) == 0 and (n & 0x55555555) == n

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

方法2:取模
如果 n 是 4 的冪,那麼它可以表示成 4^x 的形式,我們可以發現它除以 3 的餘數一定為 1。
如果 n 是 2 的冪卻不是 4 的冪,那麼它可以表示成 4^x × 2 的形式,此時它除以 3 的餘數一定為 2。因此我們可以通過 n 除以 3 的餘數是否為 1 來判斷 n 是否是 4 的冪。

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return n > 0 and (n & (n - 1)) == 0 and n % 3 == 1

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