LeetCode题库 38. 外观数列(简单)
循环方法:
Low Level的字符串处理完成;
当n为奇数时,结果会因为结尾两个数字不同而不进入循环,所以需要追加执行把最后一位填上。
看了大佬们的讨论后,循环方法执行时间长是由于频繁定义和访问导致的。
class Solution {
public String countAndSay(int n) {
String res = "1";
for(int i = 1; i < n ; ++i){
String str = "";
int t = 0;
for(int j = 1; j < res.length(); ++j){
if(res.charAt(j) != res.charAt(t)){
str += Integer.toString(j - t);
str += res.charAt(t);
t = j;
}
}
str += (Integer.toString(res.length() - t) + res.charAt(t));
res = str;
}
return res;
}
}
递归方法:
这里贴出大佬解法。
class Solution {
public String countAndSay(int n) {
// 递归终止条件
if (n == 1) {
return "1";
}
// 获取到上一层的字符串
String s = countAndSay(n - 1);
StringBuilder result = new StringBuilder();
// 记录每个数字的开始索引
int start = 0;
for (int i = 1; i < s.length(); i++) {
// 当数字发生改变时执行
if (s.charAt(i) != s.charAt(start)) {
result.append(i - start).append(s.charAt(start));
start = i;
}
}
// 字符串最后一个数字
result.append(s.length() - start).append(s.charAt(start));
return result.toString();
}
}
作者:zyxwmj
链接:https://leetcode-cn.com/problems/count-and-say/solution/xun-huan-he-di-gui-liang-chong-jie-fa-di-oof8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这里递归方法执行效率要比循环高。
笔记:
1. String类为不可变类,意思是在对String对象在修改时并不是对其本身进行修改,而是新建一个新对象并回收旧对象;
2. StringBuffer对象被建立后,提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列,StringBuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中可以连接新的字符串;
3. StringBuilder类基本与StringBuffer类相似,区别是StringBuffer是线程安全的,而StringBuilder则放弃线程安全功能以提高性能。