To Lower Case
Du erhältst eine Zeichenfolge s. Gib eine neue Zeichenfolge zurück, in der jeder englische Großbuchstabe von A bis Z durch seinen Kleinbuchstaben ersetzt wird. Jedes andere Zeichen, zum Beispiel ein Kleinbuchstabe, eine Ziffer oder ein Symbol, bleibt exakt so, wie es ist.
Funktion
- sstring
- der zu konvertierende Text
- Gibt zurückstring
- s, bei dem jeder Großbuchstabe in einen Kleinbuchstaben umgewandelt wird
Einschränkungen
1 ≤ s.length ≤ 104- Jedes Zeichen von
sist ein englischer Buchstabe, eine Ziffer oder eines der Symbole!#$%&()*+-./:;<=>?@[]^_`{|}~.
Beispiele
- Eingabe
- s = "Hello-World!"
- Ausgabe
- "hello-world!"
- Erklärung
- Die Großbuchstaben
HundWwerden zuhundw. Das-und das!sind keine Buchstaben, daher bleiben sie an ihrer Stelle.
- Eingabe
- s = "coddy_2026"
- Ausgabe
- "coddy_2026"
- Erklärung
- Es gibt keinen Großbuchstaben, der geändert werden könnte. Die Kleinbuchstaben, das
_und die Ziffern bleiben unverändert.
- Eingabe
- s = "SQL"
- Ausgabe
- "sql"
- Erklärung
- Alle drei Zeichen sind Großbuchstaben, daher wird jedes in seinen Kleinbuchstaben umgewandelt.
+15 versteckte Tests beim Einreichen
Weiterführende Frage
Kannst du toUpperCase mit derselben Schleife schreiben und erklären, warum sich die Zeichencodes von A und a nur in einem Bit unterscheiden?
Tipps
Öffne sie nacheinander. Jeder verrät ein bisschen mehr.
Ein Computer speichert jedes Zeichen als Zahl. Wie hängen die Zahlen für
Aundazusammen?AbisZsind die Codes 65 bis 90, undabiszsind 97 bis 122. Jeder Großbuchstabe liegt genau 32 unter seinem Kleinbuchstaben.Gehe die Zeichen nacheinander durch. Wenn ein Code zwischen 65 und 90 liegt, addiere 32; andernfalls behalte das Zeichen bei. Sammle die Ergebnisse und füge sie zur Antwort zusammen.
Lösung
Jede Sprache enthält eine Funktion zum Umwandeln in Kleinbuchstaben, und in produktivem Code solltest du sie aufrufen. Interviewer stellen diese Frage, um zu sehen, ob du weißt, was diese Funktion bewirkt: Ein Zeichen ist eine Zahl, und in ASCII liegt jeder Großbuchstabe genau 32 Codes unter seinem entsprechenden Kleinbuchstaben. Prüfe, ob ein Code zwischen 'A' und 'Z' liegt, und addiere 32, falls das der Fall ist.
Rufe die integrierte Kleinschreibungsfunktion auf
Idee
Python-lower(), JavaScripts toLowerCase(), Rubys downcase und ihre Entsprechungen in jeder anderen Sprache erledigen diese Aufgabe bereits. C und C++ bieten tolower für ein einzelnes Zeichen, daher rufst du es in einer Schleife auf. Jedes Zeichen wird einmal betrachtet, daher beträgt der Aufwand O(n), und der neue String benötigt O(n) Speicherplatz.
Einige dieser Funktionen richten sich nach den Spracheinstellungen des Rechners. Im Türkischen ist die Kleinschreibung von I ein punktloses ı, nicht i. Deshalb verwenden die Java- und C#-Versionen eine feste Regel mit Locale.ROOT und ToLowerInvariant, damit sich das Ergebnis nicht von einem Computer zum anderen ändert.
Im Berufsalltag ist das die richtige Antwort. In einem Vorstellungsgespräch wird sie oft nicht akzeptiert, weil sie genau die eine Idee verbirgt, um die es in der Frage geht.
Algorithmus
- Rufe die Funktion deiner Sprache zur Umwandlung in Kleinbuchstaben für
sauf oder wende in C und C++tolowerauf jedes Zeichen an. - Verwende eine feste, sprachunabhängige Regel, sofern die Funktion eine solche anbietet.
- Gib das Ergebnis zurück.
def toLowerCase(s):
return s.lower()Die Zeichencodes von Großbuchstaben verschieben
Idee
Jedes Zeichen wird als Zahl gespeichert. In ASCII entsprechen A bis Z den Codes 65 bis 90 und a bis z den Codes 97 bis 122. Beide Folgen sind alphabetisch geordnet und liegen 32 auseinander. Daher ergibt sich der Code des Kleinbuchstabens zu jedem Großbuchstaben aus dessen Code plus 32: H hat den Code 72 und h den Code 104.
Gehe also einmal die Zeichenkette durch. Liegt ein Code zwischen 65 und 90, addiere 32; andernfalls übernimm das Zeichen unverändert. Die Bereichsprüfung ist wichtig: Die Symbole [, ^ und _ liegen zwischen Z und a, und @ steht direkt vor A. Würde man nur code < 97 prüfen, würde _ in ein anderes Symbol umgewandelt.
Jedes Zeichen wird einmal geprüft, das entspricht einer Laufzeit von O(n). Das Ergebnis ist eine neue Zeichenkette gleicher Länge und benötigt O(n) Speicherplatz. 'a' - 'A' statt 32 zu schreiben, bedeutet dasselbe und erklärt, woher die Zahl kommt.
Algorithmus
- Kopiere
sin ein Array aus Zeichen oder Zeichencodes. - Lies für jede Position den Zeichencode aus.
- Wenn der Code zwischen
'A'(65) und'Z'(90) liegt, addiere 32. - Wandle das Array wieder in einen String um und gib ihn zurück.
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)
Stolperfallen und Grenzfälle
Die Schleife ist kurz, daher liegen die Fehler bei der Bereichsprüfung und beim Erstellen der Antwort.
- Zu jedem Zeichen, das kein Kleinbuchstabe ist, 32 addieren. Auch Ziffern und Symbole würden sich ändern:
1würde zuQ. - Nur ein Ende des Bereichs prüfen.
code < 'a'erfasst auch[,_und@, undcode >= 'A'erfasst auch jeden Kleinbuchstaben. - An den Bereichsgrenzen
<statt<=verwenden, wodurchAoderZgroßgeschrieben bleibt. - Die Antwort mit
result = result + chin einer unveränderlichen Zeichenkette erstellen. Bei jedem Schritt wird alles bisher Erstellte kopiert, was fürn = 10^4quadratischen Aufwand bedeutet. - In C in die Eingabe schreiben oder das abschließende
'\0'vergessen. Für die Kopien + 1Bytes reservieren.
Häufige Fragen4
Wie wandelst du einen String ohne eine eingebaute Funktion in Kleinbuchstaben um?
Gehe die Zeichen durch und sieh dir den Zeichencode jedes Zeichens an. Liegt der Code zwischen 65 (A) und 90 (Z), addiere 32, um den Kleinbuchstaben zu erhalten; alle anderen Zeichen bleiben unverändert. Füge die Zeichen wieder zu einer Zeichenkette zusammen.
Warum beträgt der Unterschied zwischen Groß- und Kleinbuchstaben 32?
ASCII ordnet die Großbuchstaben den Codes 65 bis 90 und die Kleinbuchstaben den Codes 97 bis 122 zu, mit sechs Symbolen dazwischen. Beide Alphabete haben dieselbe Reihenfolge, daher liegen die Buchstabengleichungen jeweils 97 - 65 = 32 auseinander. 32 entspricht einem einzelnen Bit, daher wandelt das Setzen dieses Bits einen Großbuchstaben in seinen Kleinbuchstaben um.
Kannst du die Groß- und Kleinschreibung mit einer Bitoperation ändern?
Ja. Bei einem Großbuchstaben setzt code | 32 das Bit, das die beiden Fälle unterscheidet, und ergibt den Kleinbuchstaben; code & ~32 löscht es wieder. Du musst trotzdem zuerst den Bereich prüfen, da derselbe Bit-Trick auch Ziffern und Symbole verändern würde.
Wie hoch ist die Zeitkomplexität beim Umwandeln einer Zeichenfolge in Kleinbuchstaben?
Die Laufzeit beträgt O(n) für einen String der Länge n, da jedes Zeichen einmal überprüft wird. Der neue String benötigt O(n) Speicherplatz. Wenn du ein Zeichenarray direkt ändern kannst, sinkt der zusätzliche Speicherplatz auf O(1).
Ähnliche Aufgaben
Aufgaben mit denselben Ideen. Wer zwei oder drei davon löst, behält das Muster.
Python
def toLowerCase(s):
# Schreibe hier den CodeFall 1
Fall 2
Fall 3
Eingabe
s = "Hello-World!"
Erwartet
"hello-world!"