題目
給定一個(gè)整數(shù),寫(xiě)一個(gè)函數(shù)來(lái)判斷它是否是 4
的冪次方果港。如果是,返回 true
糊昙;否則京腥,返回 false
。
整數(shù) n
是 4
的冪次方需滿足:存在整數(shù) x
使得 n == 4x
溅蛉。
示例 1:
- 輸入:
n = 16
- 輸出:
true
示例 2:
- 輸入:
n = 5
- 輸出:
false
示例 3:
- 輸入:
n = 1
- 輸出:
true
提示:
-231 <= n <= 231 - 1
前言
如果 是
的冪公浪,那么
一定也是
的冪。因此我們可以首先判斷
是否是
的冪船侧,在此基礎(chǔ)上再判斷
是否是
的冪欠气。
判斷 是否是
的冪可以參考 2的冪的題解。由于這一步的方法有很多種镜撩,在下面的題解中预柒,我們使用
這一方法進(jìn)行判斷。
方法一:二進(jìn)制表示中 1 的位置
思路及解法
如果 是
的冪袁梗,那么
的二進(jìn)制表示中有且僅有一個(gè)
宜鸯,并且這個(gè)
出現(xiàn)在從低位開(kāi)始的第偶數(shù)個(gè)二進(jìn)制位上(這是因?yàn)檫@個(gè)
后面必須有偶數(shù)個(gè)
)。這里我們規(guī)定最低位為第
位遮怜,例如
時(shí)淋袖,
的二進(jìn)制表示為
唯一的 出現(xiàn)在第
個(gè)二進(jìn)制位上,因此
是
的冪锯梁。
由于題目保證了 是一個(gè)
位的有符號(hào)整數(shù)即碗,因此我們可以構(gòu)造一個(gè)整數(shù)
,它的所有偶數(shù)二進(jìn)制位都是
陌凳,所有奇數(shù)二進(jìn)制位都是
剥懒。這樣一來(lái),我們將
和
進(jìn)行按位與運(yùn)算合敦,如果結(jié)果為
初橘,說(shuō)明
二進(jìn)制表示中的
出現(xiàn)在偶數(shù)的位置,否則說(shuō)明其出現(xiàn)在奇數(shù)的位置充岛。
根據(jù)上面的思路保檐, 的二進(jìn)制表示為:
我們也可以將其表示成 進(jìn)制的形式,使其更加美觀:
代碼
class Solution {
func isPowerOfFour(_ n: Int) -> Bool {
return n > 0 && n & (n - 1) == 0 && n % 3 == 1
}
}
復(fù)雜度分析
時(shí)間復(fù)雜度:
裸准。
空間復(fù)雜度:
展东。
方法二:取模性質(zhì)
思路及解法
如果 是
的冪,那么它可以表示成
的形式炒俱,我們可以發(fā)現(xiàn)它除以
的余數(shù)一定為
盐肃,即:
如果 是
的冪卻不是
的冪,那么它可以表示成
的形式权悟,此時(shí)它除以
的余數(shù)一定為
砸王。
因此我們可以通過(guò) 除以
的余數(shù)是否為
來(lái)判斷
是否是
的冪。
代碼
class Solution {
func isPowerOfFour(_ n: Int) -> Bool {
return n > 0 && n & (n - 1) == 0 && n & 0xaaaaaaaa == 0
}
}
復(fù)雜度分析
時(shí)間復(fù)雜度:
峦阁。
空間復(fù)雜度:
谦铃。