Wataru, Спасибо еще раз за совет! Посидев 2 часа, что-то не вышло переделать, так чтобы возвращалось только int-овое значение позиции, а ответ собирать в 3 параметре метода. Но зато как-то быстро заработало с использованием дополнительного класса для возврата, где есть 2 поля (номер и текущая строка). Если вас не затруднит, не могли бы вы помочь со способом , где передается дополнительный reference параметр? Хоть и сделал одним способом, но перфекционизм не дает покоя :)
Вот что получилось с использованием доп. класса. Тут совсем было просто.
spoiler
public class UnpackStringNew {
public static CurrentStringNew unpackString(String s, int begin){
int i = begin;
StringBuilder ans = new StringBuilder();
while (i < s.length()){
if (s.charAt(i) == ']') break;
if( (s.charAt(i) >= '0') && (s.charAt(i)<='9')){
int k =0;
while ((i < s.length()) && (s.charAt(i) >= '0') && (s.charAt(i)<='9')){
k= 10*k + ((int) s.charAt(i) - (int) '0');
i++;
}
if ((s.charAt(i) >= 'a' && s.charAt(i) <= 'z') || (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z')){
char [] repeatedChar = new char[k];
Arrays.fill(repeatedChar,s.charAt(i));
ans.append(repeatedChar);
i++;
} else if (s.charAt(i) == '['){
CurrentStringNew currentStringNew = unpackString(s, i + 1);
i = currentStringNew.Pos;
for (int j = 0; j < k; j++) {
ans.append(currentStringNew.currentStr);
}
}
} else {
ans.append(s.charAt(i));
i++;
}
}
if (i < s.length()) i++;
CurrentStringNew currentStringNew = new CurrentStringNew();
currentStringNew.currentStr = ans;
currentStringNew.Pos = i;
return currentStringNew;
}
public static void main(String[] args) {
CurrentStringNew s = unpackString("3[xyz]4[xy]z", 0);
System.out.println(s.currentStr);
}
}
class CurrentStringNew {
int Pos;
StringBuilder currentStr;
}
Wataru, большое спасибо. Вариант с передачей ещё одного дополнительного параметра StringBuilder помимо i и s мне нравится. Попробую переделать. Если не сложно можете дать какой-то совет по изучению рекурсивных алгоритмов? Когда начинается рекурсия с ветвлением или же рекурсивные вызовы внутри цикла, голова кругом идёт.
Wataru, Добрый день! Спасибо большое за решение, пытался решить аналогичную задачу правда на Java. Попробовал переписать алгоритм с python на java и понял, что для работы функции правильно нужно возвращать не только строку рекурсивно, но и позицию. Так вот, не могли бы подсказать как можно было бы переделать алгоритм, чтобы можно было обойтись возвратом одного значения?( Ведь в java нет возврата нескольких значений). Вроде бы несложно, но что-то не выходит. Заранее спасибо!
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Вот что получилось с использованием доп. класса. Тут совсем было просто.