#java #алгоритм #строки #reverse #substring
public class StringReverseAlgorithm { public static void main(String[] args) { System.out.println(reverseStringWithRecursion("Как это работает?")); } public static String reverseStringWithRecursion(String inputString) { String rightPart; String leftPart; int length = inputString.length(); // заканчиваем рекурсивный обход if (length <= 1) { return inputString; } Что происходит в следующих 2 строках? Почему мы доходим до среднего символа в leftPart, начинаем с того же среднего символа в rightPart, но символ не дублируется? leftPart = inputString.substring(0, length / 2); rightPart = inputString.substring(length / 2, length); Почему, если мы меняем местами только правую и левую часть, переворачивается вся строка, то есть все символы записываются в обратном порядке? return reverseStringWithRecursion(rightPart) + reverseStringWithRecursion(leftPart); } }
Ответы
Ответ 1
Если вы пишете str.substring(a, b), то вы берёте подстроку с символа с номером a, до символа с номером b - 1, в терминах математики вы указываете полуинтервал [a, b), то есть левый конец включается, а правый нет. В строках leftPart = inputString.substring(0, length / 2); rightPart = inputString.substring(length / 2, length); вы берёт строку [1 .. n] (это написаны индексы символов) и разваливаете её в две подстроки: [1 .. n/2 - 1] и [n/2 .. n], затем каждую из них переворачиваете рекурсивным вызовом, получаются строки [n/2 - 1 .. 1] и [n .. n/2], и, меняя местами, склеиваете обратно, получается: [n .. n/2] + [n/2 - 1 .. 1] = [n .. n/2 n/2 - 1 .. 1] = [n .. 1], строка в обратном порядке, что и было заявлено.Ответ 2
Дополню ответ zcorvid: В конце мы передаём строку в принимаемое значение, что приводит к тому, что метод выполняется заново и это происходит до тех пор, пока половины строк больше одного символаОтвет 3
Почему мы доходим до среднего символа в leftPart, начинаем с того же среднего символа в rightPart, но символ не дублируется? Читайте документацию. В классе String метод substring принимает на вход полуоткрытый интервал [а, b). То есть правый край интервала не входит в возвращаемую подстроку. Таким образом, никакого "дублирования символа" тут нет и не должно быть. Символ с индексом length / 2 попадет только в правую подстроку, но не в левую. Почему, если мы меняем местами только правую и левую часть, переворачивается вся строка, то есть все символы записываются в обратном порядке? Мы не просто меняем местами правую и левую часть. Мы еще предварительно выполняем рекурсивный вызов той же самой функции reverseStringWithRecursion для правой и левой части в отдельности. В результате правая и левая части переворачиваются. Несложно убедиться, что это приведет к перевороту исходной строки.
Комментариев нет:
Отправить комментарий