在思路中一直潜意识的觉得Java中不能使用指针,要改变思路!
使用双指针的做法,去逐项描述,求得第 n 项:
n>=1,从第2项开始逐项对前一项进行描述
- 从左往右遍历pre,当元素相同时,移动end指针,直至元素不相同时,那么此时end-start就是相同元素的个数,而start指针指向的元素就是重复的元素,进行拼接,cur += str(end-start) + pre(start)
- 令start指向end所在的位置,开始记录下个元素出现的次数
- 重复上面的步骤,直至end指针到达序列项尾部,便可得到当前项。
class Solution {
public String countAndSay(int n) {
String[] str = new String[31];
str[0] = "1";
for(int i=0; i<n; i++) {
int start = 0;
StringBuffer cur = new StringBuffer();
String str2 = str[i]; //1
for(int j=0; j<str2.toCharArray().length; j++) {
//System.out.println("j::" + j);
if(j+1 == str2.length()) {
cur = cur.append(j+1-start).append(str2.charAt(j));
}else {
if(str2.charAt(j+1) != str2.charAt(j)) {
cur = cur.append(j+1-start).append(str2.charAt(j));
start = j+1;
}
}
}
str[i+1] = cur.toString();
}
return str[n-1];
}
}
但是效率很低,所以参考答案中使用的递归方法比较快:
class Solution {
public String countAndSay(int n) {
if(n == 1) {
return "1";
}
int start = 0;
StringBuffer cur = new StringBuffer();
String str = countAndSay(n-1);
for(int i=1; i<str.length() + 1; i++) {
if(i == str.length()) {
cur.append(i-start).append(str.charAt(start));
}else if(str.charAt(i) != str.charAt(start)){
cur.append(i-start).append(str.charAt(start));
start = i;
}
}
return cur.toString();
}
}