持续创作,加速成长!这是我参与「掘金日新计划 · 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);
};