leetcode刷题记录-779. 第K个语法符号

106 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

前言

今天的题目为中等,简单的找规律的题目,通过列举出几个例子来找到前后变化的规律,就可以简单的解决这道题

每日一题

今天的题目是 779. 第K个语法符号,难度为中等

  • 我们构建了一个包含 n 行( 索引从 1  开始 )的表。首先在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。

  • 例如,对于 n = 3 ,第 1 行是 0 ,第 2 行是 01 ,第3行是 0110 。

  • 给定行数 n 和序数 k,返回第 n 行中第 k 个字符。( k 从索引 1 开始)

示例 1:

输入: n = 1, k = 1
输出: 0
解释: 第一行:0

示例 2:

输入: n = 2, k = 1
输出: 0
解释: 
第一行: 0 
第二行: 01

示例 3:

输入: n = 2, k = 2
输出: 1
解释:
第一行: 0
第二行: 01

 

提示:

  • 1 <= n <= 30
  • 1 <= k <= 2n - 1

题解

递归

题目的意思是不断地去变化一个数字串,第一次是0,第二次是01,第三次,0变为01,1变为10,就是0110,根据n的大小继续按照这个规律不断的变化下去,直到达到了n行。

因为每一个都会从0开始,所以说所有的变化其实都是一样的,我们就是需要来对这个变化的过程找点规律,好去判断每一位上的值都是什么。

然后我们多列几个出来看一下,找一下前后的规律

0
01
01 10
01 10 10 01
0110 1001 1001 0110
01101001 10010110 10010110 01101001

可以从中看出来,其实每一行的下一行的数,是可以通过和上一行的关系去推断出来的,比如n行中第k个字符可以转化成n-1行第(k + 1) / 2个位置的字符,转化成n - 2行第(((k + 1) / 2) + 1) / 2个位置的字符。。。

以此类推,这就可以列出简单的递归公式,然后哦处理一下n为1的特殊情况,这道题就解决了。

var kthGrammar = function(n, k) {
    if (k === 1) {
        return 0;
    }
    if (k > (1 << (n - 2))) {
        return 1 ^ kthGrammar(n - 1, k - (1 << (n - 2)));
    }
    return kthGrammar(n - 1, k);
};

image.png