Не понимаю принцип переворота строки

126
14 июля 2021, 00:50
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);
    }
}
Answer 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],

строка в обратном порядке, что и было заявлено.

Answer 2

Дополню ответ zcorvid: В конце мы передаём строку в принимаемое значение, что приводит к тому, что метод выполняется заново и это происходит до тех пор, пока половины строк больше одного символа

Answer 3

Почему мы доходим до среднего символа в leftPart, начинаем с того же среднего символа в rightPart, но символ не дублируется?

Читайте документацию. В классе String метод substring принимает на вход полуоткрытый интервал [а, b). То есть правый край интервала не входит в возвращаемую подстроку. Таким образом, никакого "дублирования символа" тут нет и не должно быть. Символ с индексом length / 2 попадет только в правую подстроку, но не в левую.

Почему, если мы меняем местами только правую и левую часть, переворачивается вся строка, то есть все символы записываются в обратном порядке?

Мы не просто меняем местами правую и левую часть. Мы еще предварительно выполняем рекурсивный вызов той же самой функции reverseStringWithRecursion для правой и левой части в отдельности. В результате правая и левая части переворачиваются. Несложно убедиться, что это приведет к перевороту исходной строки.

READ ALSO
Как освободить инициатора события?

Как освободить инициатора события?

уважаемое сообщество!

89
Проблемы с TimeZone при подключении MySQL к intelijiIdea

Проблемы с TimeZone при подключении MySQL к intelijiIdea

Создал пустой проект в intelijiIdea "Hello, Word", решил подключиться к серверу через боковую панельку DataBase -> + -> Data Source -> MySQLДанные для подключения ввел...

109
При запуске теста выскакивает NullPointerException

При запуске теста выскакивает NullPointerException

Приложение выполняет деление в столбик и выводит весь процесс в консольвсе работает, тесты проходит, проблема в том что при запуске теста...

121