链接
题目
在第一行我们写上一个
0
。接下来的每一行,将前一行中的0
替换为01
,1
替换为10
。给定行数
N
和序数K
,返回第N
行中第K
个字符。(K
从1开始)
示例
输入: N = 1, K = 1
输出: 0输入: N = 2, K = 1
输出: 0输入: N = 2, K = 2
输出: 1输入: N = 4, K = 5
输出: 1解释:
第一行: 0
第二行: 01
第三行: 0110
第四行: 01101001
说明
N
的范围[1, 30]
.K
的范围[1, 2^(N-1)]
.
思路
我们可以发现,这是一个二叉树结构,且子节点序号如果为偶数,则与父节点相反,子节点序号为奇数则相同。如我们拿第二行和第三行来看(01,0110),对于父节点为01中的1的子节点来说,子节点序号为3,则同为父节点的1,子节点序号为4,则与父节点的1相反,为0,因此可以通过递归来层层判断。
C++ Code
class Solution {
public:
int kthGrammar(int n, int k) {
if(n==1 && k==1) return 0;
int a=kthGrammar(n-1,(k+1)/2);
return k%2==1 ? a:1-a; //K为奇数则与父节点相同,为偶数则不同
}
};