在第一行我们写上一个 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)].
思路:
找规律的题目
规律1:N大于2时,N是奇数的话,第N行的前半段和后半段是镜面对称的
规律2:N大于1时,N是偶数的话,第N行的前半段和后半段是互补的
因此可以递归实现,函数kthGrammar( N, K)即为第N行的第K个字符
则有kthGrammar(N,1)=0,kthGrammar(N,2)=1
class Solution {
public:
int kthGrammar(int N, int K)
{
if (K > pow(2, N - 1))
return -1;
if (K == 1)
return 0;
if (K == 2)
return 1;
int mid=pow(2,N-2);
if (K > mid)
{
if (N % 2 == 1)//奇数行的后半段就是上一行(偶数行)的镜面对称
return kthGrammar(N - 1, pow(2, N - 1) - K + 1);
else//偶数行的后半段就是上一行的互补
return !kthGrammar(N - 1, pow(2, N - 1) - K + 1);
}
else
return kthGrammar(N - 1, K);
}
};