题目介绍
在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为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
注意:
N的范围[1, 30].K的范围[1, 2^(N-1)]. leetcode-779 第K个语法符号
b站视频
解题思路
将题目画成以上的图,可以发现以下几个规律:
- 每一层的数量为 2 ^ (n - 1)
- 每一层前半部分的字符与上一层的字符完全一致
- 每一层后半部分的字符正好与前半部分的字符相反
由于 0 替换为 01,1 替换为 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
}
};