[路飞]_779. 第K个语法符号

230 阅读1分钟

题目介绍

在第一行我们写上一个 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)
    }
};