题目介绍
在第一行我们写上一个 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) 链接:leetcode-cn.com/problems/k-… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
第一行: 0 第二行: 01 第三行: 01 10 第四行: 0110 1001 通过观察可以发现,当前行的前半部分都是,上一行的值,后半部分就是上一行取反的值 1.先获取字符的长度,2 * (n - 1) 2.如果k 大于长度的一般,就是取上一行的值,然后取反 3.否则就是取上一行的值
/**
* @param {number} n
* @param {number} k
* @return {number}
*/
var kthGrammar = function(n, k) {
if (n === 1) return 0
let len = 2 ** (n - 1)
if (k > len / 2) {
// 得到上一行的值,然后取反
let val = kthGrammar(n - 1, k - len / 2)
return val === 0 ? 1 : 0
} else {
return kthGrammar(n - 1, k)
}
};