zoukankan      html  css  js  c++  java
  • 第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与返回值相同,否则相反
        }
    };
  • 相关阅读:
    Linux系统类别
    ST-GCN基于skeleton的动作识别
    (gcc/g++)/clang/cl编译器
    羽毛球经典教材范例
    opencv批量读取图片
    十六、mysql 变量
    十五、mysql 存储过程
    十四、mysql 视图
    十三、mysql TCL语言
    十二、mysql 标识列
  • 原文地址:https://www.cnblogs.com/tianzeng/p/12015191.html
Copyright © 2011-2022 走看看