Постановка задачи:
Для входной строки s измените порядок слов на обратный. Слово определяется как последовательность символов, не являющихся пробелами. Слова в s будут разделены хотя бы одним пробелом. Возвращает строку слов в обратном порядке, объединенную одним пробелом.
Обратите внимание, что s может содержать начальные или конечные пробелы или несколько пробелов между двумя словами. Возвращаемая строка должна содержать только один пробел, разделяющий слова. Не включайте лишних пробелов.
Пример 1:
- Ввод: s = "небо голубое"
- Вывод: «голубое небо»
Пример 2:
- Ввод: s = "привет, мир"
- Вывод: «мировой привет»
- Объяснение: перевернутая строка не должна содержать пробелов в начале и конце.
Пример 3:
- Ввод: s = "хороший пример"
- Вывод: «пример хорошего качества»
- Объяснение: Вам необходимо сократить несколько пробелов между двумя словами до одного пробела в перевернутой строке.
Ограничения:
- 1
-
s содержит английские буквы (прописные и строчные), цифры и пробелы ' '.
- В s есть хотя бы одно слово.
Первоначальный мыслительный процесс:
Чтобы решить эту проблему, нам необходимо:
- Разбить строку на слова.
- Измените порядок слов.
- Соедините слова вместе, оставив между ними один пробел.
Основное решение:
Код:
function reverseWordsBruteForce(s: string): string {
// Split the string by spaces and filter out empty strings
let words = s.trim().split(/\s /);
// Reverse the array of words
words.reverse();
// Join the words with a single space
return words.join(' ');
}
Анализ временной сложности:
-
Временная сложность: O(n), где n — длина строки. Разделение, реверсирование и объединение занимают линейное время.
-
Пространственная сложность: O(n), где n — длина строки. Мы сохраняем слова в массиве, а конечный результат — в строке.
Ограничения:
Это решение эффективно с учетом ограничений. Однако для массива слов используется дополнительное пространство.
Оптимизированное решение:
Если строковый тип данных является изменяемым и нам нужно решить его на месте с дополнительным пространством O(1), мы можем использовать метод двух указателей, чтобы перевернуть слова в исходной строке.
Код:
function reverseWordsOptimized(s: string): string {
// Trim the string and convert it to an array of characters
let chars = s.trim().split('');
// Helper function to reverse a portion of the array in place
function reverse(arr: string[], left: number, right: number) {
while (left
Анализ временной сложности:
-
Временная сложность: O(n), где n — длина строки. Каждый символ обрабатывается постоянное количество раз.
-
Пространственная сложность: O(1), поскольку мы изменяем массив на месте и используем только постоянное количество дополнительного пространства.
Улучшения по сравнению с базовым решением:
- Оптимизированное решение уменьшает сложность пространства за счет выполнения операций над массивом символов на месте.
Краевые случаи и тестирование:
Краевые случаи:
- Строка содержит начальные и конечные пробелы.
- Строка содержит несколько пробелов между словами.
- Строка содержит только одно слово.
- Длина строки находится на минимальном или максимальном пределе.
Тестовые случаи:
console.log(reverseWordsBruteForce("the sky is blue")); // "blue is sky the"
console.log(reverseWordsBruteForce(" hello world ")); // "world hello"
console.log(reverseWordsBruteForce("a good example")); // "example good a"
console.log(reverseWordsBruteForce("singleWord")); // "singleWord"
console.log(reverseWordsBruteForce(" ")); // ""
console.log(reverseWordsOptimized("the sky is blue")); // "blue is sky the"
console.log(reverseWordsOptimized(" hello world ")); // "world hello"
console.log(reverseWordsOptimized("a good example")); // "example good a"
console.log(reverseWordsOptimized("singleWord")); // "singleWord"
console.log(reverseWordsOptimized(" ")); // ""
Общие стратегии решения проблем:
-
Понимание проблемы: Внимательно прочитайте формулировку проблемы, чтобы понять требования и ограничения.
-
Определите ключевые операции: Определите необходимые ключевые операции, такие как разделение, перестановка и соединение слов.
-
Оптимизируйте читабельность: Используйте четкую и краткую логику, чтобы код было легко понять.
-
Тщательное тестирование: Проверьте решение в различных случаях, включая крайние случаи, чтобы убедиться в правильности.
Выявление подобных проблем:
-
Манипуляция строками:
- Проблемы, при которых необходимо изменить строки в зависимости от определенных условий.
- Пример: изменение порядка символов в каждом слове предложения на обратный.
-
Техника двух ударов:
- Задачи, в которых использование двух указателей может помочь оптимизировать решение.
- Пример: удаление дубликатов из отсортированного массива.
-
Алгоритмы на месте:
- Проблемы, при которых операции необходимо выполнять на месте с ограниченным дополнительным пространством.
- Пример: поворот массива вправо на k шагов.
Заключение:
- Проблему перестановки слов в строке можно эффективно решить, используя как метод грубой силы, так и оптимизированный подход на месте.
- Понимание проблемы и разбиение ее на управляемые части имеет решающее значение.
- Использование четкой логики и оптимизация для удобства чтения гарантируют легкость понимания решения.
- Тестирование с различными крайними случаями обеспечивает надежность.
- Распознавание закономерностей в проблемах может помочь применить аналогичные решения к другим проблемам.
Практикуя такие задачи и стратегии, вы сможете улучшить свои навыки решения проблем и лучше подготовиться к различным задачам кодирования.