• 第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与返回值相同,否则相反
        }
    };
  • 相关阅读:
    QT正则表达式
    unix网络编程笔记
    网页书签
    trie tree(字典树)
    C++网络爬虫抓取图片
    网络编程——客户端简单流程
    OpenCV系列--摄像头控制的简单代码
    订单号生成雪花算法
    docker 运行tomcat项目
    docker 打包springboot镜像并启动
  • 原文地址:https://www.cnblogs.com/tianzeng/p/12015191.html
Copyright © 2020-2023  润新知