Skip to content

Instantly share code, notes, and snippets.

@1ou
Created March 16, 2020 14:02
Show Gist options
  • Save 1ou/1fe1cd2052bf96a71fb1bffe7735729e to your computer and use it in GitHub Desktop.
Save 1ou/1fe1cd2052bf96a71fb1bffe7735729e to your computer and use it in GitHub Desktop.
yandex
/**
* Дана строка, состоящая из букв A-Z:
* "AAAABBBCCXYZDDDDEEEFFFAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBB"
* Нужно написать функцию RLE, которая на выходе даст строку вида:
* "A4B3C2XYZD4E3F3A6B28"
* И сгенерирует любую ошибку, если на вход пришла невалидная строка.
*
* Пояснения:
* 1. Если символ встречается 1 раз, он остается без изменений
* 2. Если символ повторяется более 1 раза, к нему добавляется количество повторений
*/
AB
public String rle(String str) {
if (str == null) {
return ""; // or exception
}
if (str.isEmpty()) {
return "";
}
final StringBuilder stringBuilder = new StringBuilder();
char lastSymbol = str.getCharAt(0);
int number = 1;
for (int i = 1; i < str.length; ++i) {
if (lastSymbol < 'A' || lastSymbol > 'Z') {
throw new IllegalStateException();
}
if (str.getCharAt(i) == lastSymbol) {
number++;
} else {
stringBuilder.append(lastSymbol);
if (number != 1) {
stringBuilder.append(number);
}
number = 1;
lastSymbol = str.getCharAt(i);
}
}
stringBuilder.append(lastSymbol);
if (number != 1) {
stringBuilder.append(number);
}
return stringBuilder.toString();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment