二進位操作 格雷碼 Gray Code _Leetcode #89

更新於 2024/11/15閱讀時間約 4 分鐘
raw-image

這題的題目在這裡:Gray Code

題目敘述

題目會給我們一個bit寬度n,要求我們造出所有格雷編碼。

格雷編碼就是一組二進位編碼,每兩個相鄰的編碼的hamming distance都是1。

如果第一次接觸的讀者,可以參考 Wiki Gray Code


測試範例

Example 1:

Input: n = 2
Output: [0,1,3,2]
Explanation:
The binary representation of [0,1,3,2] is [00,01,11,10].
- 00 and 01 differ by one bit
- 01 and 11 differ by one bit
- 11 and 10 differ by one bit
- 10 and 00 differ by one bit
[0,2,3,1] is also a valid gray code sequence, whose binary representation is [00,10,11,01].
- 00 and 10 differ by one bit
- 10 and 11 differ by one bit
- 11 and 01 differ by one bit
- 01 and 00 differ by one bit

Example 2:

Input: n = 1
Output: [0,1]

約束條件

Constraints:

  • 1 <= n <= 16

演算法

用原本gray code 遮罩演算即可,gray碼的精神是和前一個編碼的hamming distance都是1。

這邊用寬度為3的gray code生成,作示範。

寬度為三的gray code,總共會有2^3 = 8個編碼

格雷碼遮罩 i // 2 等價於 i >> 1 等價於 i右移一個bit


i=0

0的binary form是0,右移一個bit還是0

0 XOR 0 = 0 = 十進制的0


i=1

1的binary form是1,右移一個bit是0 (作為格雷碼遮罩)

1 XOR 0 = 1 = 十進制的1


i=2

2的binary form是10,右移一個bit是1 (作為格雷碼遮罩)

10 XOR 01 = 11 = 十進制的3


i=3

3的binary form是11,右移一個bit是1 (作為格雷碼遮罩)

11 XOR 01 = 10 = 十進制的2


...中間依此類推


i=7

7的binary form是111,右移一個bit是11 (作為格雷碼遮罩)

111 XOR 011 = 100 = 十進制的4


最侯,全部蒐集到的格雷編碼,等價的十進制數字就是[0,1,3,2,6,7,5,4]


程式碼

class Solution:
 def grayCode(self, n: int) -> List[int]:
  
  # total 2^n codes for bit length n
  code_count = 1 << n
  
  # generate gray code from 0, and toggle 1 bit on each iteration
  # toggle mask: ( i >> 1 )
  
  gray_codes =[ i ^ ( i >> 1 ) for i in range(code_count) ]
  
  return gray_codes

複雜度分析

時間複雜度: O(2^n)

一次線性掃描,格雷編碼的總數目有2^n個。

空間複雜度: O(2^n)

過程中,會使用到暫存的buffer array: gray_codes,長度為O(2^n)


關鍵知識點

除了字串的鏡像黏貼法,也可以使用gray code原生的遮罩產生法。

格雷碼遮罩 i // 2 等價於 i >> 1 等價於 i右移一個bit


Reference:

[1] Python/JS/C++/Go O(2^n) by toggle bitmask [w/ Example] - Gray Code - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給我們一個字串陣列nums,內容都是二進位字串,要求我們造出一個另一個相等長度,新的二進位字串,而且不和字串陣列nums內的重複。 答案可能有不只一組,回傳合任一組合法的答案皆可。
題目會給我們一個字串s,內容都是由英文小寫字母組成,要求我們計算長度為3的回文子序列有多少個? 舉例,aba者種形式的序列,就是長度為3的回文序列。
題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。 題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
題目會給定我們一個字串s,要求我們計算出同質子字串有幾個? 同質子字串的定義就是子字串內部的字元都相同,例如a, aa, aaa, ... 等等這些就是同質子字串。
題目會給定我們兩個點座標,分別是起點和終點。 另外,還有一個參數t,代表時間限制。 從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點,不能停留在原地) 請問我們能不能在時間限制內,從起點走到終點?
題目會給我們一個字串陣列nums,內容都是二進位字串,要求我們造出一個另一個相等長度,新的二進位字串,而且不和字串陣列nums內的重複。 答案可能有不只一組,回傳合任一組合法的答案皆可。
題目會給我們一個字串s,內容都是由英文小寫字母組成,要求我們計算長度為3的回文子序列有多少個? 舉例,aba者種形式的序列,就是長度為3的回文序列。
題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。 題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
題目會給定我們一個字串s,要求我們計算出同質子字串有幾個? 同質子字串的定義就是子字串內部的字元都相同,例如a, aa, aaa, ... 等等這些就是同質子字串。
題目會給定我們兩個點座標,分別是起點和終點。 另外,還有一個參數t,代表時間限制。 從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點,不能停留在原地) 請問我們能不能在時間限制內,從起點走到終點?
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
題目敘述 476. Number Complement 給定一個整數num,請輸出對應的一的補數, 也就是num二進位表達式的01對調,0換成1,1換成0。 測試範例 Example 1: Input: num = 5 Output: 2 Explanation: 5 = 0b 1
Thumbnail
題目要求計算兩個二進位字串的相加,並以字串的形式輸出。 字串內容只包含'0'或'1'字元。 複雜度分析 時間複雜度為O(m+n),空間複雜度為O(m+n)。
Thumbnail
題目敘述: Reverse Bits 給定一個32bit的整數,請逆序翻轉其二進位表達式,輸出翻轉過後的數字。 例如輸入是二進位1010111 逆序翻轉後是 1110101,對應的十進位數值是117 測試範例 Example 1: Input: n = 00000010100101000
Thumbnail
題目敘述 題目會給定三個參數a, b, c。 請問透過bit flip a 或 b 的binary bits,讓 a OR b = c 最少需要幾次bit flip? 題目的原文敘述 測試範例 Example 1: Input: a = 2, b = 6, c = 5 Output:
Thumbnail
題目敘述 題目會給我們一個整數,要求我們計算出這個整數的二進位表示法裡面,有幾個bit1? 例如 5 = 二進位的 101 => 有2個 bit1,答案為2 英文版的題目敘述在這裡
如果真的要為易經找出一個哲學性定位,個人認為那或許是,比起分析世界,更在意於探討人與世界之間的關係與位置,這是深藏內部的涵義
Thumbnail
Mengrai建立之蘭納王國控制泰國清邁一帶,勢力一度達到中國西雙版納傣族自治州,與拓地西南的元朝因爭奪今景洪市交惡,遭元朝於1301年遣劉深率大軍征討被其稱為「八百媳婦國」的蘭納,但大軍所及,軍需徵調徭役導致雲南少數民族不滿,紛起聯合反抗,加上不適熱帶叢林,於1302年蒙古兵鋒未至蘭納便被迫撤軍。
Thumbnail
昨天CBA常規賽各大獎項都陸續公佈,先把結果給大家看看。 一陣:王哲林、張鎮麟、吳前、趙繼偉、賀希寧 二陣:徐傑、孫銘徽、崔永熙、易建聯、劉澤一 外援最佳陣容:馬尚、瓊斯、薩林杰、弗格、布萊克尼 單項獎:MVP:王哲林(生涯第二次);最佳星銳球員:崔永熙;最佳主帥:王世龍;最佳防守球員:沈梓捷
Thumbnail
很多新人會問,一進的時候有爸爸牽手走紅毯跟花童灑花,那婚禮二次進場到底還能做些什麼呢?超怕冷場的啦~別擔心,OKOH來告訴你,不擔心冷場的幾種二進方式,快看過來吧
Thumbnail
父母要求,男女雙方分開辦,女方辦訂婚+歸寧,男方則是結婚。 婚宴場地由我爸媽決定,最後選擇台南商務會館,除了宴客,會館也提供同一場地的舞台給我們進行儀式,並準備奉茶等瑣事。 我們的媒人婆請專業媒人婆來,給予需求和時間後,由他來排行程
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
題目敘述 476. Number Complement 給定一個整數num,請輸出對應的一的補數, 也就是num二進位表達式的01對調,0換成1,1換成0。 測試範例 Example 1: Input: num = 5 Output: 2 Explanation: 5 = 0b 1
Thumbnail
題目要求計算兩個二進位字串的相加,並以字串的形式輸出。 字串內容只包含'0'或'1'字元。 複雜度分析 時間複雜度為O(m+n),空間複雜度為O(m+n)。
Thumbnail
題目敘述: Reverse Bits 給定一個32bit的整數,請逆序翻轉其二進位表達式,輸出翻轉過後的數字。 例如輸入是二進位1010111 逆序翻轉後是 1110101,對應的十進位數值是117 測試範例 Example 1: Input: n = 00000010100101000
Thumbnail
題目敘述 題目會給定三個參數a, b, c。 請問透過bit flip a 或 b 的binary bits,讓 a OR b = c 最少需要幾次bit flip? 題目的原文敘述 測試範例 Example 1: Input: a = 2, b = 6, c = 5 Output:
Thumbnail
題目敘述 題目會給我們一個整數,要求我們計算出這個整數的二進位表示法裡面,有幾個bit1? 例如 5 = 二進位的 101 => 有2個 bit1,答案為2 英文版的題目敘述在這裡
如果真的要為易經找出一個哲學性定位,個人認為那或許是,比起分析世界,更在意於探討人與世界之間的關係與位置,這是深藏內部的涵義
Thumbnail
Mengrai建立之蘭納王國控制泰國清邁一帶,勢力一度達到中國西雙版納傣族自治州,與拓地西南的元朝因爭奪今景洪市交惡,遭元朝於1301年遣劉深率大軍征討被其稱為「八百媳婦國」的蘭納,但大軍所及,軍需徵調徭役導致雲南少數民族不滿,紛起聯合反抗,加上不適熱帶叢林,於1302年蒙古兵鋒未至蘭納便被迫撤軍。
Thumbnail
昨天CBA常規賽各大獎項都陸續公佈,先把結果給大家看看。 一陣:王哲林、張鎮麟、吳前、趙繼偉、賀希寧 二陣:徐傑、孫銘徽、崔永熙、易建聯、劉澤一 外援最佳陣容:馬尚、瓊斯、薩林杰、弗格、布萊克尼 單項獎:MVP:王哲林(生涯第二次);最佳星銳球員:崔永熙;最佳主帥:王世龍;最佳防守球員:沈梓捷
Thumbnail
很多新人會問,一進的時候有爸爸牽手走紅毯跟花童灑花,那婚禮二次進場到底還能做些什麼呢?超怕冷場的啦~別擔心,OKOH來告訴你,不擔心冷場的幾種二進方式,快看過來吧
Thumbnail
父母要求,男女雙方分開辦,女方辦訂婚+歸寧,男方則是結婚。 婚宴場地由我爸媽決定,最後選擇台南商務會館,除了宴客,會館也提供同一場地的舞台給我們進行儀式,並準備奉茶等瑣事。 我們的媒人婆請專業媒人婆來,給予需求和時間後,由他來排行程