JuniorКодЧастоЕщё не отвечали
Развернуть порядок слов, не меняя положения пробелов
Разверните ПОРЯДОК слов в строке, оставив пробелы ровно там, где они были. Где _ — пробелы: __hello_my___dear__world_ → __world_dear___my__hello_.
Требования:
- Шаблон пробелов фиксирован; двигаются только слова. Обработайте пустую, только-пробелы, без пробелов.
std::string reverseWordsKeepSpaces(const std::string& s) {
// ваш код здесь
}
Допишите реализацию.
Соберите слова по порядку. Затем идите по исходной строке: пробелы копируйте без изменений, а в каждую максимальную непробельную серию вставляйте следующее слово, взятое с КОНЦА списка слов. Пробелы остаются на местах; разворачиваются только слова. O(n).
- ✗Нормализовать пробелы (классический разворот слов) вместо сохранения точного шаблона
- ✗Неверно обработать пробелы в начале или конце
- ✗Ломаться на строке только из пробелов или вовсе без пробелов
- →Почему классический split-и-join не подходит для этого варианта?
- →Как сделать это на месте, без лишней аллокации?
Оглавление
Задача
Разверните порядок слов, оставив все пробелы на месте.
Решение
#include <string>
#include <vector>
std::string reverseWordsKeepSpaces(const std::string& s) {
std::vector<std::string> words;
std::string cur;
for (char c : s) {
if (c == ' ') { if (!cur.empty()) { words.push_back(cur); cur.clear(); } }
else cur += c;
}
if (!cur.empty()) words.push_back(cur);
std::string out = s;
int w = words.size() - 1;
size_t i = 0;
while (i < out.size()) {
if (out[i] == ' ') { ++i; continue; }
const std::string& word = words[w--];
for (char ch : word) out[i++] = ch; // слот непробельной серии
}
return out;
}
Ключевые моменты
- Слова берём с конца списка и вставляем в непробельные слоты.
- Пробелы не трогаем — только слова.
- Краевые случаи: пустая, только пробелы, без пробелов.
Оглавление