От: | Артём | жж | |
Дата: | 03.11.24 03:07 | ||
Оценка: |
Скриншот | |
напиши функцию по перевороту порядка следования слов в строке in place оптимально по big O
Функция по переворotu порядка следования slov в строке в-place, также известная как "переворот слов" или "инверсия слова", — это сложный задача с высоким количеством возможных решений. Однако, если мы рассматриваем только строку характеров (сtring из символов), мы можем найти оптимальное решение с time complexity O(n).
Нам нужно переворотить порядок следования slov в-place, поэтому не существует необходимости создавать новый массив или использовать extra space. Мы можем сделать это с помощью двух-pointerов, одного для начала и одного для конца строки.
Следуюя алгоритму:
Начнем с двух指еров: left и right, которые указывают на начало и конец строки соответственно.
Начнем переворот из середины вправо, используя pointers left и right.
В каждом этапе мы обменяем элементы на left и right местах.
Мы продолжаем этот процесс, пока left не достигнет середины.
Однако, чтобы переворотить порядок следования слов, нам нужно учитывать разделение слов в строке. Поэтому мы можем использовать следующий алгоритм:
Найдите первый символ слова (пunctuation или espacio).
Обменяйте символы между left и right.
Продолжайте этот процесс, пока не найдете следующий символ слова.
Вот примеры кода на C:
void reverseWords(char* s) { int length = strlen(s); char* left = s; char* right = s + length - 1; while (left < right) { // Find the first symbol of a word if (*left != ' ') { break; } // Move to the next word left++; right--; // Swap symbols between left and right char temp = *left; *left = *right; *right = temp; while (left < right && *left == ' ') { left++; } } }
В этом коде мы используем два pointers left и right, которые начиная с нулевого значения, движутся вwards от конца строки. В каждом этапе мы обмениваем символы между left и right, что приводит к перевороту слова. Мы также учитываем разделение slov, найдя первый символ слова и moving to the next word.
Время Complexity: O(n)
Простота Implementation: High
Примечание: Этот алгоритм работает только для строкового представления (сtringа характеров).
// Example program
#include <iostream>
#include <string>
void reverseWords(char* s) {
int length = strlen(s);
char* left = s;
char* right = s + length - 1;
while (left < right) {
// Find the first symbol of a word
if (*left != ' ') {
break;
}
// Move to the next word
left++;
right--;
// Swap symbols between left and right
char temp = *left;
*left = *right;
*right = temp;
while (left < right && *left == ' ') {
left++;
}
}
}
int main()
{
std::string text;
std::cout << "Enter your text? ";
getline (std::cin, text);
char buffer[256];
sprintf(buffer, "%s", text.c_str());
reverseWords(buffer);
std::cout << "Hello, " << buffer << "!\n";
}
Enter your text? one two three
Hello, one two three!