外观数列」是一个整数序列,从数字 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 项。
注意:整数序列中的每一项将表示为一个字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-and-say
解题思路:要得到第n行的字符串,要先得到第n-1行的字符串。通过遍历第n-1行的字符串,得到每个字符出现的次数count和该字符ch,那么第n行的新字符串就由count和ch构成。如果直接递归,必然超时。因此,可以通过在同一个函数中从第一行或第二行的字符串开始用循环推导出余下行的字符串即可。
1.我的代码:
class Solution {
public String countAndSay(int n) {
if(n==1){
return "1";
}
else if(n==2){
return "11";
}
else{
String str="11";
for(int i=2;i<n;i++){
StringBuilder sb=new StringBuilder();
for(int j=0;j<str.length();j++){
char ch1=str.charAt(j);
int count=1;
for(int k=j+1;k<str.length();k++){
char ch2=str.charAt(k);
if(ch1==ch2){
count++;
j=k;
}
else {
break;
}
}
sb.append(count).append(ch1);
}
str=sb.toString();
}
return str;
}
}
}
2.题解代码:
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 {
builder.append(count).append(pre);
pre = c;
count = 1;
}
}
builder.append(count).append(pre);
str = builder.toString();
}
return str;
}
作者:pphdsny
链接:https://leetcode-cn.com/problems/count-and-say/solution/38-bao-shu-java-xun-huan-by-pphdsny/
来源:力扣(LeetCode)
我的代码和题解代码的差别在于,多了一个for循环。但其实这一for循环是没有必要增加的。
原文地址:https://www.cnblogs.com/xbc121/p/12252749.html