题目:
The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, ...
1
is read off as "one 1"
or 11
.
11
is read off as "two 1s"
or 21
.
21
is read off as "one 2
, then one 1"
or 1211
.
Given an integer n, generate the nth sequence.
总体的思路是:实现一个方法,根据输入的String,返回结果。题目要求最后的结果是第n个结果,那就初试的输入是1,进行n次方法计算。
针对方法有两个思路:
思路1:记录charAt(i),判断charAt(i)和charAt(i-1)是否相等,并更新count(向前比对,指针 i 每次+1)(最后要做结尾处理,当i遍历到末尾时,最后一个/串char并没有写入结果)
思路2:记录charAt(i),向后查是否和charAt(i)相等,记录count,最后移动指针 i = i + count;
(思路2的速度要比1快)
代码:
public String countAndSay(int n) {
StringBuffer sb = new StringBuffer();
sb.append("1");
for(int i=1;i<n;i++){
sb=getRe2(sb);
}
return sb.toString();
}
private StringBuffer getRe2(StringBuffer s){
StringBuffer sb = new StringBuffer();
for(int i=0;i<s.length();){
int count =1;
while(i+count<s.length()&&s.charAt(i+count)==s.charAt(i))
count++;
sb.append(count).append(s.charAt(i));
i+=count;
}
return sb;
}
private StringBuffer getRe(StringBuffer s){
if(s.length()==1)
return new StringBuffer("1").append(s);
StringBuffer re=new StringBuffer();
int count=1;
for(int i=1;i<s.length();i++){
if(s.charAt(i)==s.charAt(i-1)){
count++;
}else{
re.append(count+""+s.charAt(i-1));
count=1;
}
}
re.append(count+""+s.charAt(s.length()-1));
return re;
}
小tips:基本上涉及到String多次append,使用StringBuffer更高效。