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);
    }
};
经验分享 程序员 微信小程序 职场和发展