[路飞]_算法·每日解读--第K个语法符号

103 阅读1分钟

题解779: 第K个语法符号

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

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

示例:

输入: N = 1, K = 1
输出: 0
​
输入: N = 4, K = 5
输出: 1
解释:
第一行: 0
第二行: 01
第三行: 0110
第四行: 01101001

题意解读:

  • 本题的题意相对来说还是相对比较好于理解的,给定一个N行数和一个K第几个字符,且遵循一个变换规则,下一行将上一行的0替换为01、1替换为10
  • 循环=》判断=》替换=》遍历

代码搞起:

//数据过大时提示超时!!!
var kthGrammar = function(n, k) {
    let temp = "0"
    let str = "";
    //需不需要对k进行判断,和n所对应的字符个数进行比较?
    if(n === 1 ){
        return 0;
    }else{
        for(let i = 0;i<n-1;i++){
            for(let code of temp){
                if(parseInt(code) === 0){
                    str+="01"
                }else if(parseInt(code) === 1){
                    str+="10"
                }
            }
            temp = str;
            str = "";
        }
        return parseInt(temp[k-1])
    }
};
//借鉴评论区的代码!!未作详细解读
var kthGrammar = function(N, K) {
    //在进行0,1替换的过程中,存在一定的规律,可对k值进行辨析来较快的获取所对的数0或者1
  if (K === 1) {
    return '0'
  }
  if (K === 2) {
    return '1'
  }
  let value = K % 2 === 0 ? kthGrammar(N - 1, K / 2) : kthGrammar(N - 1, (K + 1) / 2)
​
  if (value === '0') {
    return K % 2 === 0 ? '1' : '0'
  }
​
  return K % 2 === 0 ? '0' : '1'
};

①通过循环=》判断=》替换=》遍历此步骤肯定能够行的通,但是内存消耗较大;②通过数学问题来进行解答,能够有较优解

👆 👆 以上就是个人对【第K个语法符号】的代码解法和方法解读。

所思即所想,思路即套路,一键三连哟!!!