题目简介:
我们构建了一个包含 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 <= 301 <= k <= 2^n - 1
思路:
一开始想的是用正常构造方法进行递归,发现会超时。
将前几行的数字打印出来后,发现后一半数字是前一半数字的翻转(即1变成0,0变成1),并且当前行的前一半数字与前一行的数字完全相同。
因此,我们只需要不断向上递归,判断第k个数字是属于前一半还是后一半即可。
若属于前一半,则去找上一行的第k个数字;若属于后一半,则将上一行的第k - sum / 2个数字取反即可。(sum为当前行的数字总数)。
代码如下:
1 | class Solution { |