这题题目读起来很拗口, 所以差评好多的样子2333
题目的大意:
n==1 输出是1
n==2, 前一步, 输出的结果数字是由1个1组成的, 所以是11
n==3, 前一步, 输出的结果数字是11, 由2个1组成, 所以是21
n==4, 前一步, 输出的结果数字是21, 由1个2和1个1组成, 所以是1211
n==5, 前一步, 输出是1211, 由1个1, 1个2, 和2个1组成, 所以是111221
每个循环内是从做到右读数, 归纳由几个几组成
我的答案:
public String countAndSay(int n) {
if(n==1) return "1";
if(n==2) return "11";
String str = "11";
for(int i=3; i<n+1;i++){
char last = str.charAt(0);
int count=1;
StringBuffer newStr =new StringBuffer();
for(int j=1;j<str.length();j++){
if(str.charAt(j)==last){
count++;
}else{
newStr.append(count).append(last);
last = str.charAt(j);
count=1;
}
}
newStr = newStr.append(count).append(last);
str = newStr.toString();
}
return str;
}
两层循环
内层循环中, 比较当前遍历的数字和前一个是否相同: 相同, 则计数自增1; 否则, 临时字符串newStr append count个last
需要注意的是在遍历到j==str.length()-1的时候, 对于这最后一个字符的结果这层循环没有考虑进去, 所以在内层for结束时需要再添加一次newStr = newStr.append(count).append(last);
这里的临时字符串因为要多次添加, 所以使用StringBuffer比String要快
外层循环, 从3开始, 因为内层循环中是比较当前字符串和前一个字符串, 也就是内层循环默认了前一次结果str长度至少为2, n==1的时候是"1", n==2的时候第一次出现"11", 所以外层循环从3开始, 一直到n, 也就是i<n+1