第K个语法符号

在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为011替换为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


注意:

  1. N 的范围 [1, 30].
  2. K 的范围 [1, 2^(N-1)].

分析:

    法一:使用递归,从前到后读取每一个字符,但是这种方法会超时(法一)

    法二:使用递归,找到第K个字符的父亲,如果父亲是1,衍生的就是 10 ,K是单数就返回1,双数就返回0;

                  如果父亲是 0 ,衍生的就是 01 ,那么K是单数就返回 0,双数就返回 1

法一:

// 法一
class Solution {
public:
    int kthGrammar(int N, int K) {
//         得到第n行的字符串
        string num = get_row_n(N);
        return num[K-1]-'0';
    }
    
    string get_row_n(int num){
        if(num == 1)
            return "0";
        string result = get_row_n(num-1);
        string read_num = "";
//         读取
        for(int i=0;i<result.size();i++){
            if(result[i] == '0')
                read_num += "01";
            else
                read_num += "10";
        }
        return read_num;
    }
};

法二:正确解法

class Solution {
public:
    int kthGrammar(int N, int K) {
        if(N==0)
            return 0;
//         得到它的父亲
        int result = kthGrammar(N-1,(K+1)/2);
        return result==1?(K%2):1-(K%2);
//         上面这句话的意思是下面这一坨
//         if(result == 1){
// //             偶数 10
//             if(K%2 == 0)
//                 return 0;
//             return 1;
//         }else{
// //             偶数 01
//             if(K%2 == 0)
//                 return 1;
//             return 0;
//         }
    }
};

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值