44-leetCode: 779. 第K个语法符号

135 阅读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

解题思路

本题采用递归的思路,首先由分析得出,第二行开始,每一行的前半段与前一行一致,每一行的后半段每个位置的值与前一行所在位置的值完全相反(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;
    }
};