题目
在第一行我们写上一个
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)]
.
分析
这个题目我一开始把整个字符串求了出来,事实证明这种方法是不可取的,字符串的长度是随着N以指数倍增长的,会超时。
我们没有必要求出来整个字符串是什么样子,比如我们求第11行的1000个数字是0还是1,那么第11行的第1000个数字 a 是根据哪儿来的呢,是依照第10行的第500个数字 b 而来,如果 b 为 0 ,那么 a 为 1,否则 a 为 0; b 又是依照 9行250个数字 c 来,数字才依照 8 行 125数字 d 来, d 依照 7 行 63 e 来(125,126都是根据e,但不同的是 e 比方说为0 , 那么 125 126分别为 0 1)……按此规律下去。
当 k 为偶数时,它的值 = n-1行的 k/2 == 0 ? 1 :0
当 k 为奇数时,它的值 = n-1行的 (k+1)/2 == 0 ? 0 : 1
代码
class Solution {
public int kthGrammar(int N, int K) {
if (N == 1) return 0;
if ( K % 2 == 0) {
return kthGrammar(N-1,K/2) == 0 ? 1 : 0;
}else {
return kthGrammar( N-1,(K+1)/2) == 0 ? 0 : 1;
}
}
}