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;
        }
    }
}

 

点赞