题目链接:https://leetcode.cn/problems/k-th-symbol-in-grammar/
题目描述:
我们构建了一个包含 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
解法:递归
根据题目描述,得到前1到4行结果:
第1行:0
第2行:0 1
第3行:0 1 1 0
第4行:0 1 1 0 1 0 0 1
通过观察不难发现规律,下一行的元素个数是上一行的两倍,并且下一行前半部分的元素与上一行元素完全相同,后半部分元素是上一行元素取反得到的。
因此,只要我们能找到第n行第k个字符与第一行第一个元素的演变关系,就可以得到最终结果。
代码:
class Solution {
public int kthGrammar(int n, int k) {
if(k == 1) return 0;
if(k > (1 << n - 2)) return 1 ^ kthGrammar(n-1,k - (1 << n - 2));
else return kthGrammar(n-1,k);
}
}