题目
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
1 被读作 “one 1” (“一个一”) , 即 11。
11 被读作 “two 1s” (“两个一”), 即 21。
21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1
输出: "1"
示例 2:
输入: 4
输出: "1211"
代码模板:
class Solution {
public String countAndSay(int n) {
}
}
分析
这道题刚开始看怎么都没有看懂,后面看了一些文章的解题才慢慢有了眉目。首先这个n并不代表这个正数应该怎么组成,而是代表第n次报数。第一次报数是1;第二次报数就要报第一次的那个数,则是1个1,所以就变成了11;第三次报数根据第二次的数11来读的,也就是2个1,则为21,以此类推。。。
那么我们需要取到上一个数是什么,然后去根据上一个数来读,如果这个数前面的字母和后面的字母相同,那么就是多个相同字母,我们要记录下来,直到字母不相同跳出循环,然后将几个几保存下来。
解答
class Solution {
public String countAndSay(int n) {
String result = "1";
String temp = "";
while (n > 1){
int index = 0;
char tempChar;
while (index < result.length()){
tempChar = result.charAt(index);
int count = 0;
while(index < result.length() && tempChar == result.charAt(index)){
count ++;
index ++;
}
temp = temp + count + tempChar;
}
result = temp;
temp = "";
n --;
}
return result;
}
}
PS:我看了一眼那些打败了100%的解法,直接把1到30的数给列出来了。。。怪不得打败了100%。但是我执行花了37ms,他那个执行只用了1ms,是不是在以后代码优化中,如果涉及到的情况不多,把所有情况列出来反而是最优的?