LeetCode779. 第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)].

分析

这个题目我一开始把整个字符串求了出来,事实证明这种方法是不可取的,字符串的长度是随着N以指数倍增长的,会超时。

我们没有必要求出来整个字符串是什么样子,比如我们求第11行的1000个数字是0还是1,那么第11行的第1000个数字 a 是根据哪儿来的呢,是依照第10行的第500个数字 b 而来,如果 b 为 0 ,那么 a 为 1,否则 a 为 0; b 又是依照 9行250个数字 c 来,数字才依照 8 行 125数字 d 来, d 依照 7 行 63 e 来(125,126都是根据e,但不同的是 e 比方说为0 , 那么 125 126分别为 0 1)……按此规律下去。

k 为偶数时,它的值 = n-1行的 k/2  == 0 ? 1 :0 

k 为奇数时,它的值 = n-1行的 (k+1)/2 == 0 ?  0 : 1 

代码

class Solution {
    public int kthGrammar(int N, int K) {
        if (N == 1) return 0;

        if ( K % 2 == 0) {
            return kthGrammar(N-1,K/2) == 0 ? 1 : 0;
        }else {
            return kthGrammar( N-1,(K+1)/2) == 0 ?  0 : 1;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值