代码应该执行以下操作:
编写一个名为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();
}
答案 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();
}