题目
在第一行我们写上一个 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
解题思路
本题采用递归的思路,首先由分析得出,第二行开始,每一行的前半段与前一行一致,每一行的后半段每个位置的值与前一行所在位置的值完全相反(0 =>1 & 1 => 0);首选得到每一行的长度,是2的n-1次方,那么递归处理时,如果值在前半部分,分直接返回前一行位置所在的值,如果在后半部分则返回前一行位置所在的值的相反数
/**
* @param {number} n
* @param {number} k
* @return {number}
*/
var kthGrammar = function(n, k) {
// 第一行直接返回 0
if (n === 1) return 0;
// 计算当前行的总数
const lineSum = 2 ** (n - 1);
if (k <= lineSum / 2) {
// 前半部分直接返回当前位置的值
return kthGrammar(n - 1, k);
} else {
// 后半部分先找出相对于前一行, k所在的位置的值: 位置i就是减去前半部分个数
const val = kthGrammar(n - 1, k - lineSum / 2);
// 返回相反的值即可
return val === 0 ? 1 : 0;
}
};