跳至主要內容

0779. 第K个语法符号

ITCharge大约 1 分钟

0779. 第K个语法符号open in new window

  • 标签:位运算、递归、数学
  • 难度:中等

题目链接

题目大意

描述:给定两个整数 nnkk​。我们可以按照下面的规则来生成字符串:

  • 第一行写上一个 00
  • 从第二行开始,每一行将上一行的 00 替换成 010111 替换为 1010

要求:输出第 nn 行字符串中的第 kk 个字符。

说明

  • 1n301 \le n \le 30
  • 1k2n11 \le k \le 2^{n - 1}

示例

  • 示例 1:
输入: n = 2, k = 1
输出: 0
解释: 
第一行: 0 
第二行: 01
  • 示例 2:
输入: n = 4, k = 4
输出: 0
解释: 
第一行:0
第二行:01
第三行:0110
第四行:01101001

解题思路

思路 1:递归算法 + 找规律

每一行都是由上一行生成的。我们可以将多行写到一起找下规律。

可以发现:第 kk 个数字是由上一位对应位置上的数字生成的。

  • kk 在奇数位时,由上一行 (k+1)/2(k + 1) / 2 位置的值生成。且与上一行 (k+1)/2(k + 1) / 2 位置的值相同;
  • kk 在偶数位时,由上一行 k/2k / 2 位置的值生成。且与上一行 k/2k / 2 位置的值相反。

接下来就是递归求解即可。

思路 1:代码

class Solution:
    def kthGrammar(self, n: int, k: int) -> int:
        if n == 0:
            return 0
        if k % 2 == 1:
            return self.kthGrammar(n - 1, (k + 1) // 2)
        else:
            return abs(self.kthGrammar(n - 1, k // 2) - 1)

思路 1:复杂度分析

  • 时间复杂度O(n)O(n)
  • 空间复杂度O(n)O(n)