От: | BlackEric | http://black-eric.lj.ru | |
Дата: | 05.11.24 13:35 | ||
Оценка: |
Для переворота порядка следования слов в строке "in place" на C++, можно использовать алгоритм с двумя указателями, который имеет временную сложность
O(n) и пространственную сложность O(1). Этот подход позволяет изменять исходную строку без создания дополнительных копий.
Функция для переворота слов в строке
Вот пример реализации такой функции:
#include <iostream> #include <string> #include <algorithm> void reverseWords(std::string& str) { // Шаг 1: Перевернуть всю строку std::reverse(str.begin(), str.end()); // Шаг 2: Перевернуть каждое слово в строке size_t start = 0; for (size_t end = 0; end <= str.length(); ++end) { // Если достигнут конец слова или конец строки if (end == str.length() || str[end] == ' ') { std::reverse(str.begin() + start, str.begin() + end); start = end + 1; // Переход к следующему слову } } } int main() { std::string input = "Hello World from C++"; reverseWords(input); std::cout << "Reversed words: " << input << std::endl; return 0; }
Объяснение кода
Переворот всей строки: Сначала мы переворачиваем всю строку, чтобы слова оказались в обратном порядке.
Переворот каждого слова: Затем мы проходим по строке и переворачиваем каждое слово обратно, используя два указателя (start и end). Когда мы встречаем пробел или конец строки, это означает, что мы достигли конца слова.
Примечания
Использование std::reverse из заголовка <algorithm> позволяет эффективно переворачивать диапазон символов, что делает код простым и понятным125.
Временная сложность данного алгоритма составляет O(n), где n — длина строки, так как каждый символ обрабатывается не более двух раз.
Пространственная сложность составляет O(1), так как мы не используем дополнительные структуры данных для хранения результата.