Простая расшифровка на Java

#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;
}