📏二進位操作 Power of 2_n是否為2的k次方_Leetcode #231

閱讀時間約 1 分鐘

題目敘述

題目會給定一個輸入整數n,要求我們判斷n是不是恰好為2的k次方的正整數?

題目的原文敘述


測試範例

Example 1:

Input: n = 1
Output: true
Explanation: 20 = 1

Example 2:

Input: n = 16
Output: true
Explanation: 24 = 16

Example 3:

Input: n = 3
Output: false

約束條件

Constraints:

  • -2^31 <= n <= 2^31 - 1

 n 介於32bits 整數範圍之內。

Follow up: Could you solve it without loops/recursion?

請問您能不能不要依賴迴圈或者遞回解出來這題?


演算法 二進位操作

除了第一直覺不斷除以二的模擬法,藉由最後能不能整除2來判斷以外,其實還有一個更高效率的二進位判斷法。

我們知道,所有的2^k正整數都可以寫成這個形式

2^ k = 二進位的 1 0 .....0 0

那麼

2^k - 1 就是二進位的 0 1 .....1 1

----------------------------------------

兩者做bitwise AND 會恰好等於零。

因此,我們可以說,如果n是2^k正整數,那麼n bitwise AND (n-1) 必定等於 0

如果不滿足,那麼n就一定不是2^k的正整數。


程式碼 二進位操作

class Solution:
def isPowerOfTwo(self, n: int) -> bool:

if n <= 0:
return False

# note:
# power of 2 in binary = b' 1000 ... 0
# power of 2 minus 1 in binary = b' 0111 ... 1
# bitwise AND of n and (n-1) must be 0 if n is power of 2

return ( n & ( n-1 ) ) == 0

複雜度分析 二進位操作

時間複雜度:

如果n無不限制範圍,那麼所需時間為位元寬度 = O( log n )

題目已經說是32bit的整數範圍內,可視為一次性的常數操作,所需時間為O(1)。


空間複雜度:

所用到的都是固定尺寸的臨時變數,所需空間為O(1)常數級別。


關鍵知識點

由n=2^k正整數的二進位規律,發現n和n-1做bitwise AND會恰好等於零。
利用這個特質來做判斷。

Refernce:

[1] Power of Two - LeetCode

avatar-img
89會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 476. Number Complement 給定一個整數num,請輸出對應的一的補數, 也就是num二進位表達式的01對調,0換成1,1換成0。 測試範例 Example 1: Input: num = 5 Output: 2 Explanation: 5 = 0b 1
題目敘述 Leetcode: 650. 2 Keys Keyboard 一開始初始化的時候,記事本上只有一個字元'A'。 只允許下列兩種操作 複製目前記事本上的整個字串。 貼上之前複製的內容,串接在尾端。 請問,最少需要幾個操作, 才能製造出內容都是 "AAA...A",長度為n的字串?
題目敘述 624. Maximum Distance in Arrays 給定一個輸入二維陣列arrays。 請計算的陣列距離是多少? 陣列距離的定義 = max | a - b | 其中 a, b 來自不同的一維陣列
題目敘述 860. Lemonade Change 假想一個經營檸檬水小舖的情境。 一杯檸檬水都賣$5 顧客付錢時只有三種可能,$5, $10 或 $ 20 初始時,檸檬水小舖沒有零錢。 給定一個顧客買檸檬水的付錢陣列bills,請問能不能滿足每一筆交易,並且找開零錢。 如果可以
題目敘述 Find K-th Smallest Pair Distance 給定一個輸入陣列nums和 參數k。 請找出第k小的pair distance是多少? pair distance定義為 abs( nums[i] - nums[j]), i 不等於j 也就是任意兩陣列元素差值的絕對值
題目敘述 149. Max Points on a Line 給定一串2維平面的點座標,請問最多有幾個點落在同一條直線上? 落在同一條直線也就是數學上所謂的"共線" colinear
題目敘述 476. Number Complement 給定一個整數num,請輸出對應的一的補數, 也就是num二進位表達式的01對調,0換成1,1換成0。 測試範例 Example 1: Input: num = 5 Output: 2 Explanation: 5 = 0b 1
題目敘述 Leetcode: 650. 2 Keys Keyboard 一開始初始化的時候,記事本上只有一個字元'A'。 只允許下列兩種操作 複製目前記事本上的整個字串。 貼上之前複製的內容,串接在尾端。 請問,最少需要幾個操作, 才能製造出內容都是 "AAA...A",長度為n的字串?
題目敘述 624. Maximum Distance in Arrays 給定一個輸入二維陣列arrays。 請計算的陣列距離是多少? 陣列距離的定義 = max | a - b | 其中 a, b 來自不同的一維陣列
題目敘述 860. Lemonade Change 假想一個經營檸檬水小舖的情境。 一杯檸檬水都賣$5 顧客付錢時只有三種可能,$5, $10 或 $ 20 初始時,檸檬水小舖沒有零錢。 給定一個顧客買檸檬水的付錢陣列bills,請問能不能滿足每一筆交易,並且找開零錢。 如果可以
題目敘述 Find K-th Smallest Pair Distance 給定一個輸入陣列nums和 參數k。 請找出第k小的pair distance是多少? pair distance定義為 abs( nums[i] - nums[j]), i 不等於j 也就是任意兩陣列元素差值的絕對值
題目敘述 149. Max Points on a Line 給定一串2維平面的點座標,請問最多有幾個點落在同一條直線上? 落在同一條直線也就是數學上所謂的"共線" colinear
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
題目敘述: Reverse Bits 給定一個32bit的整數,請逆序翻轉其二進位表達式,輸出翻轉過後的數字。 例如輸入是二進位1010111 逆序翻轉後是 1110101,對應的十進位數值是117 測試範例 Example 1: Input: n = 00000010100101000
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
題目敘述: Reverse Bits 給定一個32bit的整數,請逆序翻轉其二進位表達式,輸出翻轉過後的數字。 例如輸入是二進位1010111 逆序翻轉後是 1110101,對應的十進位數值是117 測試範例 Example 1: Input: n = 00000010100101000