我们构建了一个包含 n
行(索引从1开始)的表。首先在第一行我们写上一个 0
。接下来的每一行,将前一行中的0
替换为01
,1
替换为10
。
- 例如,对于
n = 3
,第1
行是0
,第2
行是01
,第3行是0110
。
给定行数 n
和序数 k
,返回第 n
行中第 k
个字符。(索引从1开始)
n=1: 0
n=2: 0 1
n=3: 0 1 1 0
n=4: 0 1 1 0 1 0 0 1
每一行的左半部分和上一行完全一致,右半部分是上一行的取反。如果k在第n行的左半部分,那么这个字符就是n-1行的第k个字符;如果k在第n行的右半部分,那么这个字符等于n-1行第个字符的取反。
class Solution {
public int kthGrammar(int n, int k) {
if(n==1) return 0;
//Math.pow()返回的类型是double,强转成int类型
if(k<=(int)Math.pow(2,n-2)) return kthGrammar(n-1,k);
return kthGrammar(n-1,k-(int)Math.pow(2,n-2))^1;
}
}