Не знаете, почему мой код не работает. Если я нахожу qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT
, я получаю qw9w5e2ry5y4qE2ET3T
, когда я должен получать q9w5e2rt5y4qw2Er3T
.Сжатие строки в Java
Кодировка длины пробега (RLE) - это простой «алгоритм сжатия» (алгоритм, который берет блок данных и уменьшает его размер, создавая блок, содержащий ту же информацию в меньшем пространстве). Он работает, заменяя повторяющиеся последовательности идентичных элементов данных короткими «токенами», которые представляют целые последовательности. Применение RLE к строке включает в себя поиск последовательностей в строке, где повторяется один и тот же символ. Каждая такая последовательность должна быть заменена «маркером», состоящим из:
количество символов в последовательности повторяющийся символ Если символ не повторяется, его следует оставить в покое.
В качестве примера рассмотрим следующую строку:
qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT
После применения алгоритма RLE, эта строка преобразуется в:
q9w5e2rt5y4qw2Er3T
В сжатой строки, "9w"
представляет собой последовательность из 9 последовательных строчные буквы "w"
символов. "5e"
представляет собой 5 последовательных строчных символов "e"
и т. Д.
Напишите программу, которая берет строку в качестве входных данных, сжимает ее с использованием RLE и выводит сжатую строку. Вопросы дела - прописные и строчные буквы должны рассматриваться как отдельные. Вы можете предположить, что в строке ввода нет цифр. На вход нет других ограничений - в нем могут быть пробелы или знаки препинания. Нет необходимости рассматривать небуквенные символы иначе, чем буквы.
public class Compress{
public static void main(String[] args){
System.out.println("Enter a string: ");
String str = IO.readString();
int count = 0;
String result = "";
for (int i=1; i<=str.length(); i++) {
char a = str.charAt(i-1);
count = 1;
if (i-2 >= 0) {
while (i<=str.length() && str.charAt(i-1) == str.charAt(i-2)) {
count++;
i++;
}
}
if (count==1) {
result = result.concat(Character.toString(a));
}
else {
result = result.concat(Integer.toString(count).concat(Character.toString(a)));
}
}
IO.outputStringAnswer(result);
}
}
Вы не должны быть, начиная с позиции '0' вместо '1'? Java с нулевым индексом – MadProgrammer
@MadProgrammer, no. Я получаю следующее сообщение об ошибке: Исключение в потоке «main» java.lang.StringIndexOutOfBoundsException: Индекс строки за пределами диапазона: -1 – user3412722
Существует проблема с состоянием в вашем 'while'. Я думаю, вы должны попробовать отладить его самостоятельно, но вместо того, чтобы дать вам ответ. Если вы не используете IDE с отладчиком, попробуйте добавить некоторые 'System.out.println', чтобы увидеть, какие символы сравниваются и когда. – ajb