题目类型:模拟,递归。
题目意思:统计字符相同的位数
思路:首先想到的就是递归解决,而且思路也比较清晰,但是找相同字符数的时候显得代码有点冗余了,一开始是这样的。
public String countAndSay(int n) {
if(n == 1)return "1";
String last = countAndSay(n-1);
int sn = last.length();
int num = 0;
StringBuilder sb = new StringBuilder();
if(sn == 1){
sb.append("1"+last.charAt(0));
return sb.toString();
}
char t1=0,t2=0;
for(int i=0; i<sn-1; i++){
t1=last.charAt(i);
t2=last.charAt(i+1);
if(t1 == t2){
num++;
if(i == sn-2){
num++;
sb.append(num+""+t1);
}
}else{
num++;
sb.append(num+""+t1);
num = 0;
}
}
if(t1!=t2){
sb.append("1"+last.charAt(sn-1));
}
return sb.toString();
}
确实,本来很清晰的代码,由于又要判断一个字符的情况,又要解决最后一个字符的情况,写在一起感觉就很混乱,后来看了下大佬们的题解,有的是用迭代的方式写的,然后有一个双指针来判断位置,我觉得挺好的这个方法,然后修改了一下自己的代码,就变成这样了。
public String countAndSay(int n) {
if(n == 1)return "1";
String last = countAndSay(n-1);//递归解决n-1的问题@[TOC]
int sn = last.length();
int start = 0,pos = 1;//双指针
StringBuilder sb = new StringBuilder();
char t1=0,t2=0;
for(int i=1; i<sn; i++){//统计字符相同的个数
t1=last.charAt(start);
t2=last.charAt(i);
if(t1 != t2){
sb.append(pos-start+""+t1);
start = pos;
}
pos++;
}
sb.append(pos-start+""+last.charAt(start));
return sb.toString();
}