我正在根据Cracking the Code Interview Version 5中的问题构建基本的压缩算法:
使用计数实现一个方法来执行基本的字符串压缩 重复的人物。例如,字符串aabcccccaaa将成为 a2blc5a3。如果“压缩”字符串不会小于原始字符串 string,你的方法应该返回原始字符串。
这是我的算法:
public static String compress(String str) {
StringBuffer comp = new StringBuffer();
int count = 1;
char currentChar = str.charAt(0);
for(int i = 0; i < str.length(); i++) {
if(currentChar == str.charAt(i)) {
count++;
} else {
comp.append(currentChar);
comp.append(count);
count = 1;
currentChar = str.charAt(i);
System.out.println(currentChar);
}
}
comp.append(currentChar);
comp.append(count);
return comp.toString();
}
当我使用以下输入运行此算法时:
System.out.println(compress("aaabcdef"));
我得到以下输出:
b
c
d
e
f
a4b1c1d1e1f1
具体来说,a
计算一次。那是为什么?
答案 0 :(得分:1)
更改此
for(int i = 1; i < str.length(); i++)
到
char currentChar = str.charAt(0);
您已计算此行的第一个字符:
{{1}}
所以你想从字符串中的第二个字符开始。
答案 1 :(得分:0)
您还可以将int count = 1;
更改为int count = 0;
那样可以解决你的问题。
答案 2 :(得分:0)
问题出在你的for循环中:
for(int i = 0; i < str.length(); i++)
应该是
for(int i = 1; i < str.length(); i++)
并提出建议,避免打印号码&#34; 1&#34;对于只出现一次的字母,您可以通过这种方式节省更多空间:更改
comp.append(count);
到
comp.append(count==1?"":count);
你的字符串更加压缩,仍然无损:
a4bcdef