- 压缩字符串:例如"aabbccdaa"——>“a2b2c2d1a2”
最初的想法是先将字符串转换为字符数组,遍历整个字符数组,将相同的字符个数计算出来,再利用deleteCharAt()和insert()去修改字符串,其间出现了数组越界异常,以及方法不具有普遍性。
//最初代码
public class Test {
public static String stringCompress(String str) {
StringBuffer sb = new StringBuffer(str);
char[] ch = str.toCharArray();
for(int i = 0; i<str.length();i++) {
int count = 1;
if(ch[i] = ch[i+1]) {
count ++;
sb.deleteCharAt(i+1);
sb.insert(i+1,count);
}
}
return sb.toString();
}
public static void main(String[] args) {
String str = "aabbccdaa";
System.out.println(stringCompress(str));
}
}
如果利用上述代码,去删减了插入字符的话,循环中每次都将获得的sb进行了修改,如果输入的str不是aabbccdaa时,就会得到错误的值,所以在经过了思考之后,改变了方法,创建一个空的字符串,将输入的字符串中连续相同的字符与其个数利用append()方法进行连接,并赋值给空的字符串,并在空字符串上不断地进行连接,得到压缩后的字符串。
public class Test {
public static String stringCompress(String str) {
//创建一个新的字符串,用来保存压缩后的结果
StringBuffer sb = new StringBuffer();
//创建下标变量
int i = 0;
//将字符串变为字符数组
char[] ch = str.toCharArray();
//外层循环,控制循环次数
while (i<str.length()) {
//定义变量,用来统计连续的相同字符的个数
int count = 1;
//内存循环,控制比较的次数
for(int j = i+1;j<str.length();j++) {
if(ch[i] == ch[j]) {
count++;
}
//如果连续的两个字符不相等,则跳出当前循环
else {
break;
}
}
if(count>1) {
sb.append(ch[i]).append(count);
}
else {
sb.append(ch[i]).append(count);
}
//连续相同字符的最后一个下标处
i = i+count;
}
return sb.toString();
}
public static void main(String[] args) {
String str = "aaaabbbeeffdwwwwwa";
System.out.println(stringCompress(str));
}
}
运行结果:
心得收获:
解题最重要的还是心态,由于太过焦躁,导致思考这道问题,花费了很长时间。在这道题中,当要去压缩一个字符串时,方法其实很简单,就是将字符串转变为字符数组,然后从0号下标开始,遍历整个字符数组,将连续的相同字符数量计算出来,然后再将0号下标所对应的字符与相同字符数连接起来存储到新的字符串中,再将下标定义到相邻的不同字符的下标处,再遍历此下标之后数组所有元素,直到字符与它不相同时,跳出循环,将之前保存的新字符串与此时下标所代表的元素以及相同元素个数进行连接,更新新的字符串。