二進位操作 計算bit1的數目 Number of 1 Bits_Leetcode #191

閱讀時間約 4 分鐘

題目敘述

題目會給我們一個整數,要求我們計算出這個整數的二進位表示法裡面,有幾個bit1?

例如 5 = 二進位的 101 => 有2個 bit1,答案為2

英文版的題目敘述在這裡


測試範例

Example 1:

Input: n = 00000000000000000000000000001011
Output: 3
Explanation: The input binary string 00000000000000000000000000001011 has a total of three '1' bits.

Example 2:

Input: n = 00000000000000000000000010000000
Output: 1
Explanation: The input binary string 00000000000000000000000010000000 has a total of one '1' bit.

Example 3:

Input: n = 11111111111111111111111111111101
Output: 31
Explanation: The input binary string 11111111111111111111111111111101 has a total of thirty one '1' bits.

 


約束條件

Constraints:

  • The input must be a binary string of length 32.

 

Follow up: If this function is called many times, how would you optimize it?


演算法

可以透過向右平移和LSB檢查來實現一個高效能的線性時間演算法。

可以想像LSB上頭有一個探針每讀到1個bit1,計數器就累加1,就著再向右平移一次,總共迭代、遞迴32次,最終的計數器累計值就是答案,也就是bit1 的總數。


程式碼 遞迴版本

class Solution:

 def hammingWeight(self, n: int) -> int:
  
  # Base case
  if n == 0 :
   return 0
  
  # General case:
  # hammingWeight(n)
  # = hammingWeight(n / 2) + LSB
  # = hammingWeight(n / 2) + odd bit
  # = hammingWeight(n / 2) + ( n & 1)
  
  # Python's right shift operator is >>
  return (n & 1) + self.hammingWeight( n >> 1 )

複雜度分析

時間複雜度: O(32) = O(1)

線性掃描,從右到左掃描每個bit,總共耗時O(32) = O(1) = 常數級別


空間複雜度: O(32) = O(1)

從右到左掃描每個bit,遞迴深度為O(32) = O(1) = 常數級別


程式碼 迭代版本

class Solution:
 def hammingWeight(self, n: int) -> int:
  
  num_of_1s = 0
  
  for i in range(32):
   
   num_of_1s += (n & 1)
   
   n = n >> 1
   
  return num_of_1s

時間複雜度: O(32) = O(1)

線性掃描,從右到左掃描每個bit,總共耗時O(32) = O(1) = 常數級別


空間複雜度: O(32) = O(1)

從右到左掃描每個bit,迭代長度為O(32) = O(1) = 常數級別


額外補充,Python 在3.10後的版本,提供內建函數,可以直接返回bit 1 count

(若在面試 上機考時,

仍然建議先寫出上方遞迴法或迭代法的演算法,來展現二進位操作的知識與能力)

class Solution:   
 def hammingWeight(self, n: int) -> int:
  
  return n.bit_count()

關鍵知識點

從二進位的規律,想到用平移bitwiseAND 來計算一個二進位表示法裡面有幾個bit 1


Reference:

[1] Python/JS/Java/Go/C++ O( lg n ) by bit-manipulation - Number of 1 Bits - LeetCode

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
易學亂談-易經、二進位編碼、科學如果真的要為易經找出一個哲學性定位,個人認為那或許是,比起分析世界,更在意於探討人與世界之間的關係與位置,這是深藏內部的涵義
avatar
易學小生
2023-09-07
2017二進二出泰國之最美的風景(二)泰國簡史Mengrai建立之蘭納王國控制泰國清邁一帶,勢力一度達到中國西雙版納傣族自治州,與拓地西南的元朝因爭奪今景洪市交惡,遭元朝於1301年遣劉深率大軍征討被其稱為「八百媳婦國」的蘭納,但大軍所及,軍需徵調徭役導致雲南少數民族不滿,紛起聯合反抗,加上不適熱帶叢林,於1302年蒙古兵鋒未至蘭納便被迫撤軍。
Thumbnail
avatar
高紹沖
2023-05-21
一個新秀,憑什麼可以進二陣昨天CBA常規賽各大獎項都陸續公佈,先把結果給大家看看。 一陣:王哲林、張鎮麟、吳前、趙繼偉、賀希寧 二陣:徐傑、孫銘徽、崔永熙、易建聯、劉澤一 外援最佳陣容:馬尚、瓊斯、薩林杰、弗格、布萊克尼 單項獎:MVP:王哲林(生涯第二次);最佳星銳球員:崔永熙;最佳主帥:王世龍;最佳防守球員:沈梓捷
Thumbnail
avatar
只關於籃球 - 邢晨(停更)
2023-04-09
好苦惱的婚禮二次進場!OKOH推薦婚宴二進之不冷場方式給你知很多新人會問,一進的時候有爸爸牽手走紅毯跟花童灑花,那婚禮二次進場到底還能做些什麼呢?超怕冷場的啦~別擔心,OKOH來告訴你,不擔心冷場的幾種二進方式,快看過來吧
Thumbnail
avatar
阿崑攝影師
2023-02-23
[關於結婚]2:訂婚當天: 傳統龍鳳掛奉茶、少女公主二進@台南父母要求,男女雙方分開辦,女方辦訂婚+歸寧,男方則是結婚。 婚宴場地由我爸媽決定,最後選擇台南商務會館,除了宴客,會館也提供同一場地的舞台給我們進行儀式,並準備奉茶等瑣事。 我們的媒人婆請專業媒人婆來,給予需求和時間後,由他來排行程
Thumbnail
avatar
藍貞貞
2022-10-15
賭國運進行二戰後首次動員:等待普京與俄羅斯的,是1917或1945?9月21日,俄羅斯總統普京(Vladimir Putin,又譯作普丁、蒲亭或蒲廷)發表面向全國的公開電視講話,宣佈即日起在俄羅斯聯邦境內進行部分動員。據路透社表示,這是俄羅斯在二戰後的首次動員,阿富汗戰爭、車臣戰爭時都未曾有過。
Thumbnail
avatar
劉燕婷
2022-09-23
【台北古亭】小吉市場|走進二樓小木屋 在陽光午後享受暖暖的小慰藉 咖啡 香料優格咖喱 烤布丁 簡單而不簡單小吉市場的空間小小的,給人的印象卻非常寬敞而溫暖。餐點的選項不多但讓人滿足,或許令人開心的事物不需要太複雜澎湃,優格香料咖哩、咖啡、烤布丁、用心的餐點很簡單也不簡單!
Thumbnail
avatar
MOBI 毛比
2022-09-06
選二項進行的我,是太寬待自己了 ~ 要學學【選3哲學】書名:選三哲學    聚焦3件事,解決工作生活兩難,搞定你的超載人生 作者:蘭蒂‧祖克柏 書版社:遠流     蘭蒂‧祖克柏說,人生有五大面向,工作、睡眠、家庭、運動和朋友。 照顧自己的健康,包含身體及心理的適應力,好的情緒表達、專注、壓力管理以及有益健康的飲食,這些,蘭蒂都放在「運動」面向裡,這樣
Thumbnail
avatar
Alyson ~ Dream Catcher
2021-11-16
[新北旅遊]市定古蹟新莊區文昌祠,三開間二進二廊式的紅磚瓦舍建築,考試族、學生族,甚至求取功名名錄必拜廟宇​ 走一趟新北市新莊區中正路,這一條有新莊廟街之稱街道。彷彿時間流盪走進清朝時光隧道內。如果說是新莊區最密集廟宇駐利街道,到不如說是先民遺跡之地。這一條廟街廟宇很多,古蹟也不少。這篇來介紹新北市定古蹟文昌祠。 新北市新莊區文昌祠相關資訊: ​​ ​​ 新北市新莊區碧江街20號 ​​ ​​ 0
Thumbnail
avatar
bravejim
2021-08-30
11/4 心悅,買進二張心悅生醫,是我第一次買生技股。以目前來說他沒有營收,就沒有EPS,所以所謂的財報變成了沒有參考性。 唯一可以看到只有他在產品的研究進度,而這也是我看他未來的可能性。 其實生技不是我的拿手,講的白一點,我始終不得其門而入,就像一直卡在新手村的人,而且還沒有看到前方的路。 心悅生醫的產品,我覺得可以分三
avatar
溫德爾
2020-11-04