有規律字串中的第k個符號 K-th Symbol in Grammar Leetcode #779

閱讀時間約 2 分鐘

題目敘述

這題的題目一個規律變化的二進位字串,問我們第N排,第K個bit是多少?

變化的規律: 上一排的0到下一排展開成01,上一排的1到下一排展開成10

第一排初始化是0

第二排是01

第三排是0110

第四排是01101001

...其餘依此類推

詳細的題目可在這裡看到


測試範例:

Example 1:

Input: n = 1, k = 1
Output: 0
Explanation: row 1: 0

Example 2:

Input: n = 2, k = 1
Output: 0
Explanation:
row 1: 0
row 2: 01

Example 3:

Input: n = 2, k = 2
Output: 1
Explanation:
row 1: 0
row 2: 01

約束條件

Constraints:

  • 1 <= n <= 30
  • 1 <= k <= 2n - 1

演算法

可以觀察生成規律

奇數編號都會和上一排的父節點(N-1, (K+1)/2)的相同

偶數編號都會和上一排的父節點(N-1, (K+1)/2)的相反

raw-image

由這個生成規律,寫出遞迴關係式,藉由遞迴解找出答案。


程式碼

class Solution:
 
 def kthGrammar(self, N: int, K: int) -> int:
  
  if N == 1:
   # Base case:
   return 0
  
  else:
   # General case:
   if K % 2 == 0:
    
    # even index of current level is opposite of parent level's [(K+1)//2]
    return 1 - self.kthGrammar(N-1, (K+1)//2)
   else:
    # odd index of current level is the same as parent level's [(K+1)//2]
    return self.kthGrammar(N-1, (K+1)//2)

複雜度分析

時間複雜度:

O( log k ) 最多往上回溯O(log k)次可以找到答案。

空間複雜度:

O( log k ) 遞迴recursion call stack 最大深度。


關鍵知識點

觀察字串生成規律,找出遞迴關係式。


Reference:

[1] Python/JS/Java/Go/C++ by math [w/ Comment] - K-th Symbol in Grammar - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
這題的題目會給我們一個輸入整數,要求我們判斷這個整數是否可以用4^k 的形式來表達?
這題算是路徑計數類的DP衍伸題(路徑數、方法數、組合數...等等這種枚舉類的題目,第一時間切入除了想到DFS+回溯法之外,也可以留意DP動態規劃解題的可能性) 題目會給我們一個指定長度為arrLen的陣列,起點從index=0開始出發,每次移動可以往左移一格,往右移一格,或是留在原地不
題目會給定兩個字串s,t,把裡面的井字號#視為鍵盤上的backspace,往前(往左方)吃掉最靠近的字元。 請位最後全部依照規則處理完以後,s,t剩下的字串內容兩者是否相等?
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給定我們一組十進位表示法的阿拉伯數字,要求我們把它轉換為對應的羅馬數字。
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
這題的題目會給我們一個輸入整數,要求我們判斷這個整數是否可以用4^k 的形式來表達?
這題算是路徑計數類的DP衍伸題(路徑數、方法數、組合數...等等這種枚舉類的題目,第一時間切入除了想到DFS+回溯法之外,也可以留意DP動態規劃解題的可能性) 題目會給我們一個指定長度為arrLen的陣列,起點從index=0開始出發,每次移動可以往左移一格,往右移一格,或是留在原地不
題目會給定兩個字串s,t,把裡面的井字號#視為鍵盤上的backspace,往前(往左方)吃掉最靠近的字元。 請位最後全部依照規則處理完以後,s,t剩下的字串內容兩者是否相等?
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給定我們一組十進位表示法的阿拉伯數字,要求我們把它轉換為對應的羅馬數字。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 九 為能清晰說明,我們給範疇次序標號 (即置頂的 1-5),使整個推導過程看似一個矩陣﹕ 1.4.1_5.3 艾杜凱維茨的推導矩陣 第 2 行的 gr:1 (C1, C2) 是說 gr 用於第 1 行的 C
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 七 指派範疇是第一步, 第二步是設定推導規則。 推導規則的作用是對某一給定的表式63 進行判定,看它是否一個貫通的表式(或詞構)。就上述英語例句而言,我們只需一個簡單的單向通則 (general rule)﹕6
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 1.2.6 熱的傳導 1.2.7 十九世紀的尾聲 三 必須說一下波希米亞數學家/邏輯學家/哲學家/神學
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 1.2.6 熱的傳導 1.2.7 十九世紀的尾聲  二 公元1829年,約翰‧狄利克雷 (Johann P
Thumbnail
1.0 從函數到函算語法 1.1 句子成份 十 按《文通》的意見,句必有起﹑語兩詞,這是最基本的句子結構。「字之為語詞,動字居多」。動字又分外動字和內動字。如是外動字,必有止詞,位於其後。22 如是內動字則不可以有止詞。如語詞非動字,而是靜字,用作語詞的靜字則稱為「表詞」。如表詞不用靜
Thumbnail
1.0 從函數到函算語法 1.1 句子成份 九 屈折變化沒有標誌句子成份如何構成句子的規則﹗這是我們的另一個觀察。句子成份屬規範性的操作指引。現再返回《文通》的意見。《文通》將詞分成七種便是語法上的規範性指引。就句讀而言,《文通》說﹕ 「夫文者,集句以成,如錦繡然,故謂之文。欲知文,
Thumbnail
只用描述的各位恐怕還是會有些霧煞煞喔,這裡我們用第一數當作範例,來帶各位跑一次。 天干順序是:甲、乙、丙、丁、戊、己、庚、辛、壬、癸。 對應數字是:1、2、3、4、5、6、7、8、9、10。 假設今天你第一個數字取出來是1,第二個數字取出來也是1,那麼對應天干就是甲、甲,所以就要翻到甲
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 九 為能清晰說明,我們給範疇次序標號 (即置頂的 1-5),使整個推導過程看似一個矩陣﹕ 1.4.1_5.3 艾杜凱維茨的推導矩陣 第 2 行的 gr:1 (C1, C2) 是說 gr 用於第 1 行的 C
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 七 指派範疇是第一步, 第二步是設定推導規則。 推導規則的作用是對某一給定的表式63 進行判定,看它是否一個貫通的表式(或詞構)。就上述英語例句而言,我們只需一個簡單的單向通則 (general rule)﹕6
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 1.2.6 熱的傳導 1.2.7 十九世紀的尾聲 三 必須說一下波希米亞數學家/邏輯學家/哲學家/神學
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 1.2.6 熱的傳導 1.2.7 十九世紀的尾聲  二 公元1829年,約翰‧狄利克雷 (Johann P
Thumbnail
1.0 從函數到函算語法 1.1 句子成份 十 按《文通》的意見,句必有起﹑語兩詞,這是最基本的句子結構。「字之為語詞,動字居多」。動字又分外動字和內動字。如是外動字,必有止詞,位於其後。22 如是內動字則不可以有止詞。如語詞非動字,而是靜字,用作語詞的靜字則稱為「表詞」。如表詞不用靜
Thumbnail
1.0 從函數到函算語法 1.1 句子成份 九 屈折變化沒有標誌句子成份如何構成句子的規則﹗這是我們的另一個觀察。句子成份屬規範性的操作指引。現再返回《文通》的意見。《文通》將詞分成七種便是語法上的規範性指引。就句讀而言,《文通》說﹕ 「夫文者,集句以成,如錦繡然,故謂之文。欲知文,
Thumbnail
只用描述的各位恐怕還是會有些霧煞煞喔,這裡我們用第一數當作範例,來帶各位跑一次。 天干順序是:甲、乙、丙、丁、戊、己、庚、辛、壬、癸。 對應數字是:1、2、3、4、5、6、7、8、9、10。 假設今天你第一個數字取出來是1,第二個數字取出來也是1,那麼對應天干就是甲、甲,所以就要翻到甲