To Lower Case
Recibes una cadena s. Devuelve una nueva cadena en la que cada letra mayúscula del inglés, de la A a la Z, se reemplaza por su letra minúscula. Todos los demás caracteres, como una letra minúscula, un dígito o un símbolo, permanecen exactamente igual.
Función
- sstring
- el texto que se debe convertir
- Devuelvestring
- s con cada letra mayúscula convertida en minúscula
Restricciones
1 ≤ s.length ≤ 104- Cada carácter de
ses una letra inglesa, un dígito o uno de los símbolos!#$%&()*+-./:;<=>?@[]^_`{|}~.
Ejemplos
- Entrada
- s = "Hello-World!"
- Salida
- "hello-world!"
- Explicación
- Las mayúsculas
HyWse convierten enhyw.-y!no son letras, así que se quedan donde están.
- Entrada
- s = "coddy_2026"
- Salida
- "coddy_2026"
- Explicación
- No hay ninguna letra mayúscula que cambiar. Las letras minúsculas, el
_y los dígitos quedan igual.
- Entrada
- s = "SQL"
- Salida
- "sql"
- Explicación
- Los tres caracteres están en mayúsculas, así que cada uno pasa a su letra minúscula.
+15 pruebas ocultas al enviar
Para ir más allá
¿Puedes escribir toUpperCase con el mismo bucle y explicar por qué solo difiere un bit del código del carácter entre A y a?
Pistas
Ábrelas de una en una. Cada una revela un poco más.
Una computadora almacena cada carácter como un número. ¿Qué relación hay entre los números de
Aya?De
AaZcorresponden los códigos del 65 al 90, y deaaz, del 97 al 122. Cada letra mayúscula está exactamente 32 por debajo de su letra minúscula.Recorre los caracteres uno por uno. Cuando un código esté entre 65 y 90, suma 32; de lo contrario, conserva el carácter. Recopila los resultados y únelos para obtener la respuesta.
Solución
Todos los lenguajes incluyen una función para convertir a minúsculas, y en el código de producción deberías llamarla. Los entrevistadores plantean este problema para comprobar si sabes qué hace esa función: un carácter es un número y, en ASCII, cada letra mayúscula está exactamente 32 códigos por debajo de su letra minúscula. Comprueba si un código está entre 'A' y 'Z', y suma 32 si lo está.
Llama a la función incorporada para convertir a minúsculas
Intuición
lower() de Python, toLowerCase() de JavaScript, downcase de Ruby y sus equivalentes en todos los demás lenguajes ya hacen este trabajo. C y C++ ofrecen tolower para un carácter, así que lo llamas en un bucle. Cada carácter se examina una vez, por lo que el trabajo es O(n), y la nueva cadena ocupa O(n) de espacio.
Algunas de estas funciones siguen la configuración de idioma del sistema. En turco, la minúscula de I es una ı sin punto, no una i. Por eso las versiones de Java y C# solicitan una regla fija con Locale.ROOT y ToLowerInvariant, para que el resultado no cambie de un ordenador a otro.
Esta es la respuesta correcta en el trabajo. En una entrevista, a menudo no se acepta porque oculta la idea principal de la pregunta.
Algoritmo
- Aplica la función de conversión a minúsculas de tu lenguaje a
s, o aplicatolowera cada carácter en C y C++. - Solicita una regla fija e independiente del lenguaje cuando la función ofrezca esa opción.
- Devuelve el resultado.
def toLowerCase(s):
return s.lower()Desplaza los códigos de caracteres de las letras mayúsculas
Intuición
Cada carácter se almacena como un número. En ASCII, A a Z corresponden a los códigos del 65 al 90, y a a z, del 97 al 122. Ambos rangos siguen el orden alfabético y empiezan con una diferencia de 32, así que el equivalente en minúscula de cualquier letra mayúscula tiene un código 32 unidades mayor: H es 72 y h es 104.
Así que recorre la cadena una vez. Si un código está entre 65 y 90, suma 32; de lo contrario, copia el carácter tal como está. La comprobación del rango es importante: los símbolos [, ^ y _ están entre Z y a, y @ está justo antes de A. Comprobar solo code < 97 convertiría _ en un símbolo diferente.
Cada carácter se comprueba una vez, lo que supone un tiempo de O(n). El resultado es una cadena nueva de la misma longitud, con un uso de espacio de O(n). Escribir 'a' - 'A' en lugar de 32 expresa lo mismo y explica de dónde sale ese número.
Algoritmo
- Copia
sen un arreglo de caracteres o códigos. - Para cada posición, lee el código del carácter.
- Si el código está entre
'A'(65) y'Z'(90), suma 32. - Convierte el arreglo de nuevo en una cadena y devuélvela.
def toLowerCase(s):
# Every capital letter sits 32 codes below its small letter: 'A' is 65, 'a' is 97.
shift = ord("a") - ord("A")
chars = []
for ch in s:
if "A" <= ch <= "Z":
ch = chr(ord(ch) + shift)
chars.append(ch)
return "".join(chars)
Errores comunes y casos límite
El bucle es corto, así que los errores están en la comprobación del rango y en cómo se construye la respuesta.
- Sumar 32 a cada carácter que no esté en minúscula. Los dígitos y los símbolos también cambiarían:
1se convertiría enQ. - Comprobar solo un extremo del rango.
code < 'a'también incluye[,_y@, ycode >= 'A'también incluye todas las letras minúsculas. - Usar
<en lugar de<=en los extremos, lo que dejaAoZen mayúscula. - Construir la respuesta con
result = result + chen una cadena inmutable. Cada paso copia todo lo acumulado hasta el momento, lo que supone un coste cuadrático paran = 10^4. - En C, escribir en la entrada u olvidar el
'\0'de terminación. Reservan + 1bytes para la copia.
Preguntas frecuentes4
¿Cómo conviertes una cadena a minúsculas sin una función integrada?
Recorre los caracteres y observa el código de cada uno. Si el código está entre 65 (A) y 90 (Z), suma 32 para obtener la letra minúscula; deja todos los demás caracteres tal como están. Vuelve a unir los caracteres en una cadena.
¿Por qué la diferencia entre mayúsculas y minúsculas es 32?
ASCII ubica las letras mayúsculas en los códigos del 65 al 90 y las minúsculas del 97 al 122, con seis símbolos en medio. Ambos alfabetos están en el mismo orden, así que cada par está separado por 97 - 65 = 32. 32 corresponde a un solo bit, así que establecer ese bit convierte una letra mayúscula en su minúscula.
¿Puedes cambiar las mayúsculas y minúsculas con una operación bit a bit?
Sí. Para una letra mayúscula, code | 32 activa el bit que separa las dos variantes y da la letra minúscula, y code & ~32 vuelve a borrarlo. Aun así, primero necesitas comprobar el rango, porque el mismo truco con bits también cambiaría los dígitos y los símbolos.
¿Cuál es la complejidad temporal de convertir una cadena a minúsculas?
Es O(n) para una cadena de longitud n, porque cada carácter se comprueba una vez. La nueva cadena ocupa un espacio de O(n). Si puedes modificar una matriz de caracteres en el mismo lugar, el espacio adicional se reduce a O(1).
Problemas similares
Problemas que usan las mismas ideas. Resolver dos o tres es lo que fija un patrón.
Python
def toLowerCase(s):
# Escribe el código aquíCaso 1
Caso 2
Caso 3
Entrada
s = "Hello-World!"
Esperado
"hello-world!"