leetcode 779. 第K个语法符号
我们构建了一个包含 n 行( 索引从 1 开始 )的表。首先在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。
例如,对于 n = 3 ,第 1 行是 0 ,第 2 行是 01 ,第3行是 0110 。 给定行数 n 和序数 k,返回第 n 行中第 k 个字符。( k 从索引 1 开始)
示例 1:
输入: n = 1, k = 1 输出: 0 解释: 第一行:0 示例 2:
输入: n = 2, k = 1 输出: 0 解释: 第一行: 0 第二行: 01 示例 3:
输入: n = 2, k = 2 输出: 1 解释: 第一行: 0 第二行: 01
提示:
1 <= n <= 30 1 <= k <= 2n - 1
class Solution {
public:
int zero[2]={0,1};
int one[2]={1,0};
int cal(int n,int k){//查询上一层对应的数字是多少
if(n==2){
if(k==0){
return 0;
}
else{
return 1;
}
}
int left=k%2;
//cout<<"now n="<<n<<" and k="<<k<<endl;
return cal(n-1,k/2)==0 ? left : 1-left;
}
int kthGrammar(int n, int k) {
if(n==1)
return 0;
return cal(n,k-1);
}
};
问号运算符的使用参考这里:
函数cal递归调用,查第n行下标为k的数是几。但是写的时候不知道为什么把1单独拿出来了,实际上可以合并一下:
class Solution {
public:
int zero[2]={0,1};
int one[2]={1,0};
int cal(int n,int k){//查询上一层对应的数字是多少
if(n==1){
return 0;
}
int left=k%2;
//cout<<"now n="<<n<<" and k="<<k<<endl;
return cal(n-1,k/2)==0 ? left : 1-left;
}
int kthGrammar(int n, int k) {
//if(n==1)
//return 0;
return cal(n,k-1);
}
};
