[Leetcode解題] 231. Power of Two
9 August 2025
medium
resursion
bit-operation
231. Power of Two
題目
231. Power of Two,給定一個int,判定它是不是2的次方數
解題思路
這題看似一個很簡單的題目,但我們卻可以複習到蠻多觀念的,大家看下去之前,可以先一起思考有哪些可能的方法
遞迴
最直覺的方法,就是使用遞迴,我們只要不斷的判斷餘數,如果餘數不為0且不等於1的情況,就代表非2的次方數
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n < 1:
return False
while n % 2 == 0:
n = n / 2
return n == 1
所以我們只需用一個while迴圈,不斷判斷並/2,如果最後不是1,就是False
bit operation
我們發現,其實我們要找到2平方數,它一定是只有一個bit是1其餘為0的狀況
所以如果我們能判斷這種特殊狀況,就可以快速得解
我們可以透過判斷 x & (x-1),如果 == 0就代表是2的平方數,反之則不是
為什麼呢?
比如8,二進位表示是1000,-1之後為0111,所以做完AND操作後為0000
如果今天是一個非2的平方數比如7,二進位表示是0111,-1之後為0110,所以做完AND操作後為0110
只有在剛好一個1的情況下才會是0
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n < 1:
return False
return n & n-1 == 0
pop_count
我們後來發現,其實CPU底層有一種特殊的operation,就是在計算bit的數量,所以這樣做會更快
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n < 1:
return False
return n.bit_count() == 1
時間複雜度
如果是透過pop_count跟bit operation,時間複雜度為$O(1)$