找不到逻辑错误

时间:2015-11-01 03:58:28

标签: java algorithm

代码应该执行以下操作:

编写一个名为compress的方法,它接受一个字符串作为输入,使用RLE压缩它,并返回压缩的字符串。大小写 - 大写和小写字符应视为不同。您可以假设输入字符串中没有数字字符。输入没有其他限制 - 它可能包含空格或标点符号。没有必要对字母进行任何不同的处理。如果一个字符不重复,则应该单独处理。

例如,请考虑以下字符串:

qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT

应用RLE算法后,此字符串将转换为:

q9w5e2rt5y4qw2Er3T

然而,当我上传它时,评分系统给出零并给我以下提示:

仔细检查您的算法是否存在逻辑错误(2次出现)

仔细检查您是否正确压缩单个字符(2次出现)

我不确定错误在哪里,因为我使用输出的所有测试用例都是正确的。

这是我的压缩方法:

public static String compress (String original)
{
    StringBuilder compressed = new StringBuilder();
    char letter = 0;
    int count = 1;
    for (int i = 0; i < original.length(); i++) {
        if (letter == original.charAt(i)) {
            count = count + 1;
        }
        else {
            compressed = count !=1 ? compressed.append(count) : compressed;
            compressed.append(letter);
            letter = original.charAt(i);
            count = 1;
        }
    }

    compressed = count !=1 ? compressed.append(count) : compressed;
    compressed.append(letter);
    return compressed.toString();
}

1 个答案:

答案 0 :(得分:2)

基于RLE https://en.wikipedia.org/wiki/Run-length_encoding的定义 单个字符也应该在它们前面有一个计数。

所以结果应该是

1q9w5e2r1t5y4q1w2E1r3T

而不是

q9w5e2rt5y4qw2Er3T

因此,您需要更改

compressed = count !=1 ? compressed.append(count) : compressed;

只是

compressed.append(count);

下面是解决它的一种方法,我对previousLetter的处理方式与你有点不同:

public static String compress(String original) {
    if (original.isEmpty()) return "";
    StringBuilder compressed = new StringBuilder();
    char previousLetter = original.charAt(0); // initialize the previous letter
    int count = 1;
    // start searching from the second letter
    for (int i = 1; i < original.length(); i++) {
        if (previousLetter == original.charAt(i)) {
            count = count + 1;
        } else {
            compressed.append(count);
            compressed.append(previousLetter);
            previousLetter = original.charAt(i);
            count = 1;
        }
    }
    compressed.append(count);
    compressed.append(previousLetter);
    return compressed.toString();
}