在第一行我们写上一个 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)].
code1:递归
class Solution { public: int kthGrammar(int N, int K) { if(N<=0||K<=0) return -1; if(N==1&&K==1) return 0; if(K&1)//K奇数,第N行第K个数字是由第N-1行,第(K+1)/2个数字决定的,此时第N行K个数字和N-1,(K-1)/2个数字相同 { int up=(K+1)/2; int res=kthGrammar(N-1,up); return res; } else//K偶数,第N行第K个数字是由第N-1行,第K/2个数字决定的,此时第N行K个数字和N-1,K/2个数字值相反 { int up=K/2; int res=kthGrammar(N-1,up); return res==0?1:0; } } };
code2:code1的改进版
class Solution { public: int kthGrammar(int N, int K) { if(N<=0||K<=0) return -1; if(N==1&&K==1) return 0; //第k个数字可以映射为(K+1)/2个数字 int up=(K+1)/2; int res=kthGrammar(N-1,up); return K&1?res:1-res;//K为奇数,则k与返回值相同,否则相反 } };