Считайте длину каждой серии одинаковых символов и дописывайте число только для серий длиннее одного. В первом тесте ошибка: в aabccccaaa четыре c, поэтому правильно a2bc4a3.
Сжатие строки за один проход
Считайте длину каждой серии одинаковых символов и дописывайте число только для серий длиннее одного. В первом тесте ошибка: в aabccccaaa четыре c, поэтому правильно a2bc4a3.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать функцию compress, которая преобразует входную строку, заменяя последовательные одинаковые символы на сам символ и количество его повторений, если повторений больше одного. Одинокие символы оставляются без изменений. Учёт регистра обязателен.
public class StringTask {
public static void main(String[] args) {
runTest("aabccccaaa", "a2bc5a3");
runTest("abcdef", "abcdef");
runTest("AAaaBB", "A2a2B2");
}
public static void runTest(String src, String exp) {
String result = compress(src);
if (!result.equals(exp)) {
System.out.printf("Test failed for input: %s%n, expected: %s, actual: %s%n", src, exp, result);
} else {
System.out.printf("Test passed for input: %s%n", src);
}
}
public static String compress(String src) {
//
}
}
Ответ
Считайте длину каждой серии одинаковых символов и дописывайте число только для серий длиннее одного. В первом тесте ошибка: в aabccccaaa четыре c, поэтому правильно a2bc4a3.
public static String compress(String src) {
java.util.Objects.requireNonNull(src);
StringBuilder out = new StringBuilder();
for (int i = 0; i < src.length();) {
char c = src.charAt(i++);
int count = 1;
while (i < src.length() && src.charAt(i) == c) { i++; count++; }
out.append(c);
if (count > 1) out.append(count);
}
return out.toString();
}
Время O(n), память O(n) под результат. Регистр учитывается, пустая строка поддерживается. Единица обработки — UTF-16 char. Если исходник содержит цифры, формат без экранирования не гарантирует однозначного восстановления.