美文网首页
算法- 第K个语法符号

算法- 第K个语法符号

作者: 雨天多久就 | 来源:发表于2019-08-05 20:13 被阅读0次

题目

在第一行我们写上一个 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

思考和分析

看到这道题的第一反应是,拿到第N行的序数,然后遍历这个序数就ok了。
但是仔细一想,感觉这样做的复杂度有点高,需要解决两个小问题。

  • 第N行的序数如何去遍历?因为参数是个整型,所以要遍历N的序数不太好操作。
  • 因为要生成第N行的序数,就需要生成N行之前所有行的序数,代价有点大。

所以感觉第一反应不靠谱,并且很难解决。

因为每一行的序数生成,都是依托上一层的。那就画下来这个生成的过程。(😂😂画的非常丑)


图1.png

从图上能够看到,第四行的偶数位置(从1开始算)和第三行的每个数是正好相反的。第四行的奇数位置(从1开始算)和第三行的每个数是正好相同的。

因此,我们可以推理出以下的查找方式:

  • 第四行的第k位置是奇数,那就找第三行的第m = (k+1)/2位置的数,要知道第三行m位置的数,就去找第二行(m+1)/2 ……
  • 第四行的第k位置是偶数,那就找第三行的第m = k/2位置的数,要知道第三行m位置的数,就去找第二行m/2 ……,找到确切的0和1后,进行取反就可以了。

所以我们可以用递归的方式来解决这道题。下面是python代码:

class Solution:
    def kthGrammar(self, N: int, K: int) -> int:
        if K == 1:
            return 0
        if N==2 and K==2:
            return 1
        if K%2 == 0:#偶数
            temp = self.kthGrammar(N-1,K//2)
            if temp:
                return 0
            else :
                return 1
        else:#奇数
            return self.kthGrammar(N-1,(K+1)//2)

相关文章

网友评论

      本文标题:算法- 第K个语法符号

      本文链接:https://www.haomeiwen.com/subject/hsjvdctx.html