第一反应当然是遍历生成结果
所以先试着把题目解出来,很久没有打代码了,记录一下一些关于StringBuilder的简单用法。
- s.apend(); 添加字符
- s.delete(0,s.length()); 清空字符串
- s.charAt(index); 查询下标为index的字符
遍历出结果后是8ms,思考了一会儿也没有什么更好的想法,只是改了一些字符串的操作,减少到了6ms
最后看答案,发现也没有什么巧妙地办法。
总结一下,递归有时会更加省时一点(虽然不知道为什么会快一点)以后知道了再来补充吧
自己的(6ms)
class Solution {
public String countAndSay(int n) {
StringBuilder ans = new StringBuilder("1");
for(int i = 1; i < n; i++){
StringBuilder s = new StringBuilder(ans);
int l = s.length();
ans = new StringBuilder();
char c = s.charAt(0);
int index = 0;
while(true){
char cont = '0';
for(;index < l && s.charAt(index) == c; index ++){
cont ++;
}
ans.append(cont);
ans.append(c);
if(index == l)
break;
c = s.charAt(index);
}
}
return ans.toString();
}
}
答案地(1ms)
`class Solution {
public String countAndSay(int n) {
// 递归出口
if(n==1){
return "1";
}
// 假设我们获得上一次的结果为 s1 = 112213
String s1 = countAndSay(n - 1);
// 定义结果
StringBuilder result = new StringBuilder();
// 对s1遍历处理获取值
char local = s1.charAt(0);
int count = 0;
for (int i = 0; i < s1.length(); i++) {
// 设定计数器 计算同一个数字出现的次数 count
if(s1.charAt(i) == local){
count++;
}else {
// 不符合,记录下
result.append(count);
result.append(local);
count = 1;
local = s1.charAt(i);
}
}
result.append(count);
result.append(local);
return result.toString();
}
}`
第一次写,就这样了