JuniorКодЧастоЕщё не отвечали
Разворот символов каждого слова с сохранением порядка слов
Дана строка из слов, разделённых пробелами. Разверните символы внутри каждого слова, сохранив порядок слов и все пробелы. Например "QUICK FOX" → "KCIUQ XOF". Правьте на месте.
Требования:
- O(n) время, O(1) дополнительной памяти.
- Сохраните точно серии нескольких пробелов и пробелы в начале/конце.
void reverseEachWord(std::string& s) {
// ваш код здесь
}
Допишите реализацию.
Идите по строке; в начале каждой максимальной непробельной серии найдите её конец, затем разверните эту серию на месте двумя указателями, меняя символы навстречу. Пробелы пропускаются и не трогаются, поэтому все пробелы сохраняются. Один проход, O(n) время, O(1) дополнительной памяти.
- ✗Нормализовать или схлопывать пробелы, когда по условию их надо сохранить точно
- ✗Разворачивать через пробелы, сливая соседние слова
- ✗Выделять новый буфер, когда ожидается решение на месте с O(1) памяти
- →Как сохранить двойные пробелы, разворачивая только символы слов?
- →Как ещё и развернуть порядок самих слов?
Оглавление
Задача
Разверните символы каждого слова на месте, сохранив порядок слов и все пробелы, за O(n) и O(1) памяти.
Решение
#include <string>
#include <algorithm>
void reverseEachWord(std::string& s) {
size_t i = 0, n = s.size();
while (i < n) {
if (s[i] == ' ') { ++i; continue; } // пробелы не трогаем
size_t j = i;
while (j < n && s[j] != ' ') ++j; // конец слова
std::reverse(s.begin() + i, s.begin() + j);
i = j;
}
}
Ключевые моменты
- Пробелы пропускаются и остаются на местах — порядок слов и зазоры сохранены.
- Каждое слово разворачивается на месте двумя указателями (
std::reverse). - Один проход, O(n) время, O(1) дополнительной памяти.
Оглавление