Planteamiento del problema:
Dada una cadena de entrada s, invierta el orden de las palabras. Una palabra se define como una secuencia de caracteres que no son espacios. Las palabras en s estarán separadas por al menos un espacio. Devuelve una cadena de palabras en orden inverso concatenadas por un solo espacio.
Tenga en cuenta que los mensajes de correo electrónico pueden contener espacios iniciales o finales o varios espacios entre dos palabras. La cadena devuelta solo debe tener un espacio que separe las palabras. No incluya espacios adicionales.
Ejemplo 1:
- Entrada: s = "el cielo es azul"
- Salida: "el azul es el cielo"
Ejemplo 2:
- Entrada: s = "hola mundo"
- Salida: "hola mundo"
- Explicación: Su cadena invertida no debe contener espacios iniciales ni finales.
Ejemplo 3:
- Entrada: s = "un buen ejemplo"
- Salida: "ejemplo bueno a"
- Explicación: Debes reducir varios espacios entre dos palabras a un solo espacio en la cadena invertida.
Restricciones:
- 1
-
s contiene letras inglesas (mayúsculas y minúsculas), dígitos y espacios ' '.
- Hay al menos una palabra en s.
Proceso de pensamiento inicial:
Para resolver este problema, necesitamos:
- Dividir la cadena en palabras.
- Invertir el orden de las palabras.
- Une las palabras nuevamente con un solo espacio entre cada una.
Solución básica:
Código:
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(' ');
}
Análisis de complejidad temporal:
-
Complejidad del tiempo: O(n), donde n es la longitud de la cadena. Dividir, revertir y unir requiere tiempo lineal.
-
Complejidad espacial: O (n), donde n es la longitud de la cadena. Almacenamos las palabras en un array y el resultado final en una cadena.
Limitaciones:
Esta solución es eficiente dadas las restricciones. Sin embargo, utiliza espacio adicional para la matriz de palabras.
Solución optimizada:
Si el tipo de datos de la cadena es mutable y necesitamos resolverlo en el lugar con O(1) espacio adicional, podemos usar una técnica de dos punteros para invertir las palabras dentro de la cadena original.
Código:
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
Análisis de complejidad temporal:
-
Complejidad del tiempo: O(n), donde n es la longitud de la cadena. Cada carácter se procesa un número constante de veces.
-
Complejidad del espacio: O(1), ya que estamos modificando la matriz en su lugar y usando solo una cantidad constante de espacio adicional.
Mejoras con respecto a la solución básica:
- La solución optimizada reduce la complejidad del espacio al realizar operaciones in situ en la matriz de caracteres.
Casos extremos y pruebas:
Casos extremos:
- La cadena contiene espacios iniciales y finales.
- La cadena contiene múltiples espacios entre palabras.
- La cadena contiene solo una palabra.
- La longitud de la cadena está en el límite mínimo o máximo.
Casos de prueba:
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(" ")); // ""
Estrategias generales para la resolución de problemas:
-
Comprenda el problema: Lea atentamente el enunciado del problema para comprender los requisitos y restricciones.
-
Identificar operaciones clave: Determinar las operaciones clave necesarias, como dividir, invertir y unir palabras.
-
Optimizar para mejorar la legibilidad: Utilice una lógica clara y concisa para garantizar que el código sea fácil de seguir.
-
Pruebe minuciosamente: Pruebe la solución con varios casos, incluidos casos extremos, para garantizar la corrección.
Identificación de problemas similares:
-
Manipulación de cadenas:
- Problemas en los que es necesario modificar cadenas en función de condiciones específicas.
- Ejemplo: invertir el orden de los caracteres en cada palabra de una oración.
-
Técnica de dos punteros:
- Problemas en los que el uso de dos punteros puede ayudar a optimizar la solución.
- Ejemplo: eliminar duplicados de una matriz ordenada.
-
Algoritmos locales:
- Problemas donde las operaciones deben realizarse en el lugar con espacio adicional limitado.
- Ejemplo: rotar una matriz hacia la derecha en k pasos.
Conclusión:
- El problema de invertir palabras en una cadena se puede resolver de manera eficiente utilizando tanto un enfoque de fuerza bruta como un enfoque optimizado in situ.
- Comprender el problema y dividirlo en partes manejables es crucial.
- Usar una lógica clara y optimizar la legibilidad garantiza que la solución sea fácil de seguir.
- Las pruebas con varios casos extremos garantizan la solidez.
- Reconocer patrones en los problemas puede ayudar a aplicar soluciones similares a otros desafíos.
Al practicar estos problemas y estrategias, puedes mejorar tus habilidades para resolver problemas y estar mejor preparado para diversos desafíos de codificación.