题目介绍
在第一行我们写上一个 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
}
};