题目简介:
我们构建了一个包含 n
行( 索引从 1 开始 )的表。首先在第一行我们写上一个 0
。接下来的每一行,将前一行中的0
替换为01
,1
替换为10
。
- 例如,对于
n = 3
,第1
行是0
,第2
行是01
,第3行是0110
。
给定行数 n
和序数 k
,返回第 n
行中第 k
个字符。( k
从索引 1 开始)
示例 1:
1 | 输入: n = 1, k = 1 |
示例 2:
1 | 输入: n = 2, k = 1 |
提示:
1 <= n <= 30
1 <= k <= 2^n - 1
思路:
一开始想的是用正常构造方法进行递归,发现会超时。
将前几行的数字打印出来后,发现后一半数字是前一半数字的翻转(即1
变成0
,0
变成1
),并且当前行的前一半数字与前一行的数字完全相同。
因此,我们只需要不断向上递归,判断第k
个数字是属于前一半还是后一半即可。
若属于前一半,则去找上一行的第k
个数字;若属于后一半,则将上一行的第k - sum / 2
个数字取反即可。(sum
为当前行的数字总数)。
代码如下:
1 | class Solution { |