#java
Вопрос:
Я пишу метод для расшифровки входной строки. Шифрование идет прямолинейно. Любой повторяющийся символ в строке заменяется символом, за которым следует количество раз, когда он появляется в строке. Итак, привет зашифрован как hel2o. Ниже приведена логика расшифровки, которая у меня есть до сих пор. Это работает, но так необходимо и включает в себя несколько циклов. Как это можно улучшить?
String input = "hel2o";
String[] inarr = input.split("\s ");
StringBuilder sb = new StringBuilder();
for(int i = 0; i < inarr.length; i ) {
String s = inarr[i];
char[] c = s.toCharArray();
for(int j = 0; j < c.length; j ) {
if(Character.isDigit(c[j])) {
for(int x = 0; x < Character.getNumericValue(c[j])-1; x ) {
sb.append(c[j-1]);
}
} else {
sb.append(c[j]);
}
}
}
System.out.printl(sb.toString());
Комментарии:
1. Так в чем же именно заключается вопрос?
2. Это работает, но так необходимо и включает в себя несколько циклов. Как это можно улучшить?
Ответ №1:
Вы в значительной степени просили о решении, но мне было весело это делать, поэтому я поделюсь.
Вы можете сделать это с помощью одного цикла, сделав несколько умных дополнений. Кроме того, в отличие от вашего, мое решение будет работать с многозначными числами, например Hel23o
, преобразуется helllllllllllllllllllllllo
в 23 литра.
String input = "hel23o";
StringBuilder builder = new StringBuilder();
char previousChar = ' ';
StringBuilder number = new StringBuilder();
for (char c : input.toCharArray()) {
if (Character.isDigit(c)) {
number.append(c);
continue;
}
if (number.length() > 0 ) {
int count = Integer.parseInt(number.toString());
count = count > 1 ? count - 1 : 0;
builder.append(String.join("", Collections.nCopies(count, String.valueOf(previousChar))));
}
builder.append(c);
previousChar = c;
number.setLength(0);
}
Альтернативно без поддержки многозначного номера:
String input = "hel3o";
StringBuilder builder = new StringBuilder();
char previousChar = ' ';
for (char c : input.toCharArray()) {
if (Character.isDigit(c)) {
builder.append(String.join("", Collections.nCopies(Character.getNumericValue(c) - 1, String.valueOf(previousChar))));
continue;
}
builder.append(c);
previousChar = c;
}