基本压缩算法

时间:2015-09-16 20:56:41

标签: java algorithm

我正在根据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计算一次。那是为什么?

3 个答案:

答案 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