Java 找不到逻辑错误

Java 找不到逻辑错误,java,algorithm,Java,Algorithm,代码应执行以下操作: 编写一个名为compress的方法,该方法将字符串作为输入,使用RLE对其进行压缩,然后返回压缩后的字符串。大小写事项-大写和小写字符应视为不同。您可以假定输入字符串中没有数字字符。输入没有其他限制-它可能包含空格或标点符号。无需将非字母字符与字母区别对待。如果字符不重复,则应将其单独处理 例如,考虑以下字符串: qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT 应用RLE算法后,此字符串将转换为: q9w5e2rt5y4qw2Er3T 然而,当我上

代码应执行以下操作:

编写一个名为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();
}

基于RLE的定义 单个字符前面也应该有一个计数

所以结果应该是

1q9w5e2r1t5y4q1w2E1r3T
而不是

q9w5e2rt5y4qw2Er3T
因此,你需要改变

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

compressed.append(count);
以下是解决问题的一种方法,我对上一封信的处理方式与您略有不同:

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();
}

你怎么知道这不是评分方面的问题?这可能是一种可能性,因为这是一个实验性的评分系统,但是,我必须假设它正在按照它应该的方式工作,在循环的第一次运行时,我看到一个问题,您将以0字符作为压缩字符串的第一个字符结束。我认为这是原因,因为它会在输出的开头留下一个空格,但我不确定如何在不留下变量的情况下更正它uninitialized@Tom你可以查看我的答案来做这件事,它使用原始字符串的第一个字符进行初始化,并从原始字符串的第二个字符开始循环搜索以进行压缩,省略1是一种改进,因为它会导致字符串比不包含的字符串更短。@LeoNix我同意,这可能是RLE版本2指定的分配指令,如果字符不重复,就不处理字符,因此,我认为1不应该是added@Tom有趣的是,评分系统给出的反馈似乎与当时的指导不一致。如果你愿意,也许你可以用这个来测试评分系统can@Tom你有评分系统运行的测试用例吗?那将非常有帮助。