[路飞]_前端算法第五十三弹-779. 第K个语法符号

131 阅读1分钟

在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为011替换为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

每一行的字符个数为Math.pow(2,n1)Math.pow(2, n - 1)个,所以若果第k个字符的位置大于上一行的字符个数,我们便能递归的得到kMath.pow(2,n2)k - Math.pow(2, n - 2)的值。为所求值取反。而我们知道,两个字符为一组的话,每两个字符都是相反的,所以我们只需要判断k的奇偶性并取反,即可得到kMath.pow(2,n2)k - Math.pow(2, n - 2)的值。直至递归到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)
};