LEETCODE算法注解38:
「外观数列」是一个整数序列,从数字 1 开始,
序列中的每一项都是对前一项的描述。前五项如下:
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 项。
注意:整数序列中的每一项将表示为一个字符串。
思路解释:
其实这道题我思路懂了,但代码写了2个小时,死活没写出来。看了大佬的代码,豁然开朗。
关键:遍历字符串,遇到连续相同的字符,继续前进,直到遇到不同时,将前面的存起来。
class Solution {
public String countAndSay(int n)
{
String str = "1";
for (int i = 2; i <= n; i++) {
StringBuilder builder = new StringBuilder();
char pre = str.charAt(0);
int count = 1;
for (int j = 1; j < str.length(); j++) {
char c = str.charAt(j);
if (c == pre) {//字符相同,继续向下遍历
count++;
} else {//字符不同,将前面的存起来,并重置pre,count
builder.append(count).append(pre);
pre = c;
count = 1;
}
}
builder.append(count).append(pre);
str = builder.toString();
}
return str;
}
}