Leetcode之Count and Say 问题
问题描述:
The count-and-say sequence is the sequence of integers with the first five terms as following:
1. 1 2. 11 3. 21 4. 1211 5. 111221
1 is read off as "one 1"
or11
.
11
is read off as "two 1s"
or 21
.
21
is read off as "one 2
, then one 1"
or1211
.
Given an integer n, generate the nth term of the count-and-say sequence.
Note: Each term of the sequence of integers will be represented as a string.
示例一:
Input: 1
Output: "1"
示例二:
Input: 4
Output: "1211"
问题来源:Count and Say (详细地址:https://leetcode.com/problems/count-and-say/description/)
思路分析:
首先我们来理解一下题目的意思,顺着题目给的例子,第一行"1":我们读作1个1,所以标记成11;接着第二行,是"11",我们读作2个1,所以标记成21;接着第三行"21",我们读作1个2和1个1,因此标记成1211;接着第四行,我们读作1个1,1个2,2个1,因此标记成111221.也不知道你们找到规律没?如果没的话,那在这我简单说一下,第一行是"1",标记成11,发现啥没?第二行不就是我们刚才的标记结果吗?不信的话,我们继续,第二行为"11",我们标记成了21,你看,下一行不就是我们的标记结果吗?所以这一行的标记结果就是下一行的输入。
下面我们谈谈如何解答这道题,首先返回的都是字符串,我们需要一个一个地将字符添加进去,所以在这最好采用StringBuilder,而不直接使用String了,避免产生过多没必要的对象,首先第一行我们必须直接赋值s="1",首先需要一个计数器count,i用来表示哪一行,j用来表示该行字符串的哪个字符,如果这个字符等于它后面的一个 字符的话,我们不需要干别的,只需要count++,然后j++;反之,如果不相等或者已经走到最后一个字符了的话,我们需要做的就多一些了,说先需要把当前的计数器累加上,再加上是什么字符,最后计数器得重新开始计数。每遍历完一行,我们就需要将它保存下来,作为下一行的输入使用。
代码: