在第一行我们写上一个 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行的第k个字符和第m行的第k个字符相同,在n,m行都存在k个字符的前提下。并且每一行的前一半字符与后一半字符正好相反。
第四行: 01101001
0110
1001
每一行的字符个数为个,所以若果第k个字符的位置大于上一行的字符个数,我们便能递归的得到的值。为所求值取反。而我们知道,两个字符为一组的话,每两个字符都是相反的,所以我们只需要判断k的奇偶性并取反,即可得到的值。直至递归到k=1时,为0。
var kthGrammar = function (n, k) {
if (k == 1) return 0;
if (k > Math.pow(2, n - 2)) {
k = k - Math.pow(2, n - 2)
k = k % 2 == 0 ? k - 1 : k + 1
}
return kthGrammar(n - 1, k)
};