每日力扣-第K个语法符号

70 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。

题目(已做删减处理)

我们构建了一个包含 n 行( 索引从 1  开始 )的表。首先在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为011替换为10。例如,对于 n = 3 ,第 1 行是 0 ,第 2 行是 01 ,第3行是 0110 。给定行数 n 和序数 k,返回第 n 行中第 k 个字符。( k 从索引 1 开始

分析

我们通过模拟数据来寻找规律。

image.png 如上图所示,每一行的前部分,对应的都是上一行的数字。而后半部分,是前半部分的发转。即前半部分中的0变为1,1变为0. 假定当前字符为s,那么我们可以这么来分析:

  1. 如果s小于等于n的1/2,那么我们直接获取上一行的字符即可;
  2. 如果s大于n的1/2,那么我们获取行一行的s-2^(n-2)个字符即可。 上述的过程中,因为我们需要从第一行来进行统计分析,那么我们遍历的过程中就需要依次遍历对应的长度。

总结

一道常规的递归遍历题目。和之前的题目不同的是,它是需要找到数字规律,然后进行思考的。因此也包含了些许的数学内容。对于递归的算法题目,我们最重要的还是要确定递归的条件,最好能够写出来,自己模拟一下递归的过程。这样才能保证递归的准确性。

解题证明

image.png