To Lower Case
Hai una stringa s. Restituisci una nuova stringa in cui ogni lettera maiuscola inglese, da A a Z, viene sostituita dalla sua corrispondente lettera minuscola. Ogni altro carattere, come una lettera minuscola, una cifra o un simbolo, rimane esattamente com’è.
Funzione
- sstring
- il testo da convertire
- Restituiscestring
- s con ogni lettera maiuscola trasformata in minuscola
Vincoli
1 ≤ s.length ≤ 104- Ogni carattere di
sè una lettera inglese, una cifra o uno dei simboli!#$%&()*+-./:;<=>?@[]^_`{|}~.
Esempi
- Input
- s = "Hello-World!"
- Output
- "hello-world!"
- Spiegazione
- Le lettere maiuscole
HeWdiventanohew.-e!non sono lettere, quindi restano dove sono.
- Input
- s = "coddy_2026"
- Output
- "coddy_2026"
- Spiegazione
- Non c'è nessuna lettera maiuscola da cambiare. Le lettere minuscole, il
_e le cifre rimangono invariati.
- Input
- s = "SQL"
- Output
- "sql"
- Spiegazione
- Tutti e tre i caratteri sono maiuscoli, quindi ciascuno diventa la rispettiva lettera minuscola.
+15 test nascosti all’invio
Per approfondire
Riesci a scrivere toUpperCase usando lo stesso ciclo e a spiegare perché tra A e a cambia solo un bit del codice del carattere?
Suggerimenti
Aprili uno alla volta. Ognuno rivela un po’ di più.
Un computer memorizza ogni carattere come un numero. In che modo sono correlati i numeri di
Aea?Da
AaZi codici vanno da 65 a 90, e daaazda 97 a 122. Ogni lettera maiuscola ha un codice esattamente 32 unità inferiore a quello della corrispondente lettera minuscola.Esamina i caratteri uno per uno. Se un codice è compreso tra 65 e 90, aggiungi 32; altrimenti mantieni il carattere. Raccogli i risultati e uniscili per ottenere la risposta.
Soluzione
Ogni linguaggio include una funzione per convertire in minuscolo, e nel codice di produzione dovresti chiamarla. Gli intervistatori pongono questo problema per verificare se sai cosa fa quella funzione: un carattere è un numero e, in ASCII, ogni lettera maiuscola si trova esattamente 32 codici prima della corrispondente lettera minuscola. Controlla se un codice rientra tra 'A' e 'Z' e, in caso affermativo, aggiungi 32.
Chiama la funzione integrata per convertire in minuscolo
Intuizione
Il metodo lower() di Python, toLowerCase() di JavaScript, downcase di Ruby e i loro equivalenti in tutti gli altri linguaggi fanno già questo lavoro. C e C++ offrono tolower per un singolo carattere, quindi lo richiami in un ciclo. Ogni carattere viene esaminato una volta sola, quindi il lavoro richiede O(n) e la nuova stringa occupa O(n) spazio.
Alcune di queste funzioni seguono le impostazioni della lingua del computer. In turco, la minuscola di I è una ı senza punto, non una i. Ecco perché le versioni Java e C# richiedono una regola fissa con Locale.ROOT e ToLowerInvariant, così il risultato non cambia da un computer all'altro.
Questa è la risposta giusta sul lavoro. In un colloquio spesso non viene accettata, perché nasconde l'unica idea al centro della domanda.
Algoritmo
- Chiama la funzione per convertire in minuscolo del tuo linguaggio su
s, oppure chiamatolowersu ogni carattere in C e C++. - Chiedi una regola fissa e indipendente dal linguaggio, se la funzione ne offre una.
- Restituisci il risultato.
def toLowerCase(s):
return s.lower()Sposta i codici dei caratteri delle lettere maiuscole
Intuizione
Ogni carattere è memorizzato come un numero. In ASCII, da A a Z i codici vanno da 65 a 90, mentre da a a z vanno da 97 a 122. Entrambi gli intervalli seguono l’ordine alfabetico e iniziano a 32 di distanza l’uno dall’altro, quindi la versione minuscola di qualsiasi lettera maiuscola ha un codice pari al suo codice più 32: H è 72 e h è 104.
Quindi scorri la stringa una volta. Se un codice è compreso tra 65 e 90, aggiungi 32; altrimenti copia il carattere così com’è. Il controllo dell’intervallo è importante: i simboli [, ^ e _ si trovano tra Z e a, mentre @ si trova subito prima di A. Verificare solo code < 97 trasformerebbe _ in un simbolo diverso.
Ogni carattere viene controllato una volta, quindi il tempo richiesto è O(n). Il risultato è una nuova stringa della stessa lunghezza, con spazio O(n). Scrivere 'a' - 'A' invece di 32 esprime la stessa cosa e spiega da dove viene il numero.
Algoritmo
- Copia
sin un array di caratteri o codici. - Per ogni posizione, leggi il codice del carattere.
- Se il codice è compreso tra
'A'(65) e'Z'(90), aggiungi 32. - Riconverti l'array in una stringa e restituiscila.
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)
Trappole e casi limite
Il ciclo è breve, quindi gli errori riguardano il controllo dell'intervallo e il modo in cui viene costruita la risposta.
- Aggiungere 32 a ogni carattere che non è minuscolo. Cambierebbero anche le cifre e i simboli:
1diventerebbeQ. - Controllare solo un'estremità dell'intervallo.
code < 'a'intercetta anche[,_e@, mentrecode >= 'A'intercetta anche tutte le lettere minuscole. - Usare
<invece di<=agli estremi, lasciando cosìAoZin maiuscolo. - Costruire la risposta con
result = result + chsu una stringa immutabile. A ogni passaggio viene copiata tutta la stringa costruita fin lì, con una complessità quadratica pern = 10^4. - In C, scrivere nell'input o dimenticare il terminatore
'\0'. Allocaren + 1byte per la copia.
Domande frequenti4
Come si converte una stringa in minuscolo senza una funzione integrata?
Passa in rassegna i caratteri e osserva il codice di ciascuno. Se il codice è compreso tra 65 (A) e 90 (Z), aggiungi 32 per ottenere la lettera minuscola; lascia invariati tutti gli altri caratteri. Ricongiungi i caratteri in una stringa.
Perché la differenza tra maiuscole e minuscole è 32?
ASCII colloca le lettere maiuscole ai codici da 65 a 90 e le lettere minuscole da 97 a 122, con sei simboli in mezzo. I due alfabeti sono nello stesso ordine, quindi ogni coppia è distante di 97 - 65 = 32. 32 corrisponde a un singolo bit, quindi impostando quel bit si trasforma una lettera maiuscola nella corrispondente lettera minuscola.
Puoi cambiare le maiuscole e le minuscole con un'operazione bit a bit?
Sì. Per una lettera maiuscola, code | 32 imposta il bit che distingue le due forme e restituisce la lettera minuscola, mentre code & ~32 lo azzera di nuovo. Devi comunque controllare prima l’intervallo, perché lo stesso trucco con i bit modificherebbe anche le cifre e i simboli.
Qual è la complessità temporale della conversione di una stringa in minuscolo?
È O(n) per una stringa di lunghezza n, perché ogni carattere viene controllato una volta. La nuova stringa occupa uno spazio O(n). Se puoi modificare un array di caratteri sul posto, lo spazio aggiuntivo scende a O(1).
Problemi simili
Problemi che usano le stesse idee. Risolverne due o tre è ciò che fissa uno schema.
Python
def toLowerCase(s):
# Scrivi il codice quiCaso 1
Caso 2
Caso 3
Input
s = "Hello-World!"
Atteso
"hello-world!"