第K个语法符号

在第一行我们写上一个 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)].

code1:递归

class Solution {
public:
    int kthGrammar(int N, int K) {
        if(N<=0||K<=0)
            return -1;
        if(N==1&&K==1)
            return 0;

        if(K&1)//K奇数,第N行第K个数字是由第N-1行,第(K+1)/2个数字决定的,此时第N行K个数字和N-1,(K-1)/2个数字相同
        {
            int up=(K+1)/2;
            int res=kthGrammar(N-1,up);
            return res;
        }
        else//K偶数,第N行第K个数字是由第N-1行,第K/2个数字决定的,此时第N行K个数字和N-1,K/2个数字值相反
        {
            int up=K/2;
            int res=kthGrammar(N-1,up);
            return res==0?1:0;
        }
    }
};

 code2:code1的改进版

class Solution {
public:
    int kthGrammar(int N, int K) {
        if(N<=0||K<=0)
            return -1;
        if(N==1&&K==1)
            return 0;

        //第k个数字可以映射为(K+1)/2个数字
        int up=(K+1)/2;
        int res=kthGrammar(N-1,up);
        return K&1?res:1-res;//K为奇数,则k与返回值相同,否则相反
    }
};
原文地址:https://www.cnblogs.com/tianzeng/p/12015191.html