Вывести строку в обратном порядке, каждую вторую букву

11. Вывести каждый второй символ строки в обратном порядке

Условие задачи:
Дана строка.

Необходимо с помощью Stream API:

  • обходить строку в обратном порядке;

  • брать каждый второй символ, начиная с последнего;

  • не использовать reverse();

  • не создавать дополнительные внешние структуры данных;

  • выполнить обработку одним stream-конвейером.

Код:

String s = "Spring Boot!";

Спойлеры к решению

Подсказки
💡 Удобно стримить не сами символы, а их индексы.
💡 Начни с последнего индекса строки и двигайся назад с шагом 2.
💡 По индексу получай символ через charAt().
💡 Для формирования результата используй Collectors.joining().

Решение

Вариант для Java 9+:

String result = IntStream.iterate(
                s.length() - 1,
                i -> i >= 0,
                i -> i - 2
        )
        .mapToObj(i -> String.valueOf(s.charAt(i)))
        .collect(Collectors.joining());

System.out.println(result);

Для строки:

Spring Boot!

индексы будут обходиться так:

11, 9, 7, 5, 3, 1

Поэтому результат:

!oBgip

Здесь строка физически не разворачивается. Stream сразу идёт с конца строки с шагом 2.

Если нужна совместимость с Java 8, можно использовать IntStream.range():

String result = IntStream.range(0, s.length() / 2)
        .map(i -> s.length() - 1 - i * 2)
        .mapToObj(i -> String.valueOf(s.charAt(i)))
        .collect(Collectors.joining());

Временная сложность — O(n), дополнительная память помимо результирующей строки — O(1).

Важно: здесь под «каждым вторым» понимаются последний символ, затем через один, то есть позиции 1, 3, 5... в уже развёрнутой последовательности. Если требуется именно второй, четвёртый, шестой символ развёрнутой строки, стартовый индекс нужно сместить на один.