Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

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

#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 для правой и левой части в отдельности. В результате правая и левая части переворачиваются. Несложно убедиться, что это приведет к перевороту исходной строки.

Комментариев нет:

Отправить комментарий