持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
题目详情
LeetCode题库序号 779. 第K个语法符号 ,难度为 中等。
Tag : 「模拟」
我们构建了一个包含 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
模拟
题解思路:
首先题目中要求我们求得第n行的第k个字符的字符是多少。首先我们得到看到第 i 行中会有 2^i−1 个数字,:首行为 0
,每次用当前行拓展出下一行时,字符数量翻倍(将 0
拓展为 01
,将 1
拓展为 10
),且字符种类仍为 01
。题目解法详情见以下代码:
题解代码
class Solution {
public int kthGrammar(int n, int k) {
if (n == 1) {
return 0;
}
return (k & 1) ^ 1 ^ kthGrammar(n - 1, (k + 1) / 2);
}
}
结尾
我的"刷完LeetCode题库"系列文章的第 No.779. 第K个语法符号
序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!
思路虽然不是最优的,但是我会尽我所能!
为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/… 。