持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。
题目(已做删减处理)
我们构建了一个包含
n行( 索引从 1 开始 )的表。首先在第一行我们写上一个0。接下来的每一行,将前一行中的0替换为01,1替换为10。例如,对于n = 3,第1行是0,第2行是01,第3行是0110。给定行数n和序数k,返回第n行中第k个字符。(k从索引 1 开始)
分析
我们通过模拟数据来寻找规律。
如上图所示,每一行的前部分,对应的都是上一行的数字。而后半部分,是前半部分的发转。即前半部分中的0变为1,1变为0.
假定当前字符为s,那么我们可以这么来分析:
- 如果s小于等于n的1/2,那么我们直接获取上一行的字符即可;
- 如果s大于n的1/2,那么我们获取行一行的s-2^(n-2)个字符即可。 上述的过程中,因为我们需要从第一行来进行统计分析,那么我们遍历的过程中就需要依次遍历对应的长度。
总结
一道常规的递归遍历题目。和之前的题目不同的是,它是需要找到数字规律,然后进行思考的。因此也包含了些许的数学内容。对于递归的算法题目,我们最重要的还是要确定递归的条件,最好能够写出来,自己模拟一下递归的过程。这样才能保证递归的准确性。