【路飞】算法与数据结构-第K个语法符号

141 阅读1分钟

LeetCode:地址

题目要求

在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为011替换为10

给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)

示例 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

注意:

  1. N 的范围 [1, 30].
  2. K 的范围 [1, 2^(N-1)].
思路

根据N和K递归判断,当前行的第K个,如果k为偶数应该看上一行的第k/2个,否则看上一行的k/2+1个,注意js应为Math.floor(k/2)+1。 然后根据上一行的指定结果判断,如果k为偶数,返回相反的数,如果为奇数,返回相同的数。

代码
/**
 * @param {number} N
 * @param {number} K
 * @return {number}
 */

var kthGrammar = function(N, K) {
    let res;
    if(N===1)return 0;
    if(K%2){
        res = kthGrammar(N-1,Math.floor(K/2)+1);
    }else{
        res = kthGrammar(N-1,K/2);
    }
    if(K%2){
        return res;
    }else{
        return res===0?1:0;
    }
    
};