[路飞]_第K个语法符号

145 阅读2分钟

题目介绍

在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为011替换为10

给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)

例子

输入: N = 1, K = 1
输出: 0

输入: N = 2, K = 1
输出: 0

输入: N = 2, K = 2
输出: 1

输入: N = 4, K = 5
输出: 1

解释:
第一行: 0
第二行: 01
第三行: 0110
第四行: 01101001

注意:

  1. N 的范围 [1, 30].
  2. K 的范围 [1, 2^(N-1)]. leetcode-779 第K个语法符号
    b站视频

解题思路

1641314457(1).png 将题目画成以上的图,可以发现以下几个规律:

  1. 每一层的数量为 2 ^ (n - 1)
  2. 每一层前半部分的字符与上一层的字符完全一致
  3. 每一层后半部分的字符正好与前半部分的字符相反

由于 0 替换为 011 替换为 10,两者正好相反,而每一层后半部分的字符都是由上一层后半部分字符替换而来,所以会出现上述规律中的现象,我们则利用此规律进行解题

解题代码

var kthGrammar = function(n, k) {
    // 如果 k 为 1,则直接返回 0
    if (k === 1) return 0
    // 如果 k 处于第 n 层的前半部分,那么递归从其上一层的相同位置可以找到该字符
    // 因为每一层的数量为 2 ^ (n-1),所以一半就是 2 ^ (n-2)
    if (k <= Math.pow(2, n - 2)) {
        return kthGrammar(n - 1, k)
    } else {
    // 如果 k 处于第 n 层的后半部分,那么 k 的值与上一层前半部分与其对应位置的字符相反
    // 将 k 值减去该层数量的一半,就是前半部分与 k 对应的位置
        return kthGrammar(n - 1, k - Math.pow(2, n - 2)) === 0 ? 1 : 0
    }
};