Reverse a String
Otrzymujesz ciąg znaków s składający się z angielskich liter i cyfr. Zwróć nowy ciąg znaków z tymi samymi znakami w odwrotnej kolejności, tak aby ostatni znak był pierwszy, a pierwszy — ostatni. Zachowaj każdy znak dokładnie takim, jaki jest, łącznie z wielkością liter.
Funkcja
- sstring
- ciąg znaków do odwrócenia
- Zwracastring
- znaki ciągu s w odwrotnej kolejności
Ograniczenia
1 ≤ s.length ≤ 104szawiera tylko angielskie litery (adoz,AdoZ) i cyfry (0do9).
Przykłady
- Wejście
- s = "Coddy2026"
- Wyjście
- "6202yddoC"
- Wyjaśnienie
- Odczytaj
Coddy2026od ostatniego znaku do pierwszego:6,2,0,2, następniey,d,d,oi na końcu wielką literęC.
- Wejście
- s = "noon"
- Wyjście
- "noon"
- Wyjaśnienie
noonjest palindromem, więc po odwróceniu pozostaje tym samym słowem. Zewnętrzne literynzamieniają się miejscami, a następnie robią to dwie literyo.
- Wejście
- s = "Q"
- Wyjście
- "Q"
- Wyjaśnienie
- Ciąg znaków zawierający jeden znak nie ma z czym go zamienić, więc pozostaje bez zmian.
+14 ukrytych testów przy wysłaniu
Pytanie dodatkowe
Jak odwrócić kolejność słów w zdaniu, zamieniając hello big world na world big hello, tak aby każde słowo zachowało właściwą kolejność liter?
Podpowiedzi
Otwieraj je po kolei. Każda zdradza trochę więcej.
Znak o indeksie
0trafia na koniec odpowiedzi. Gdzie trafia znak o indeksiei?Przenosi się na indeks
n-1-i. Pierwszy i ostatni znak zamieniają się miejscami, potem drugi i przedostatni, i tak dalej, w kierunku środka.Skopiuj ciąg do tablicy znaków. Ustaw jeden indeks na początku, a drugi na końcu, zamień miejscami oba znaki i przesuwaj oba indeksy do środka, aż się spotkają. Następnie połącz tablicę z powrotem w ciąg.
Rozwiązanie
Każdy znak ma ustalone miejsce docelowe: znak o indeksie i należy umieścić pod indeksem n-1-i. Możesz zapisać znaki w nowym ciągu znaków w tej kolejności albo zamieniać je parami, zaczynając od obu końców. O zamianę najczęściej pytają rekruterzy, ponieważ ten sam ruch dwóch wskaźników odwraca tablicę w miejscu i sprawdza, czy jest palindromem.
Skopiuj znaki od końca
Intuicja
Odwrócony zapis s zaczyna się od ostatniego znaku s, zawiera następnie przedostatni znak, a kończy się pierwszym. Przechodź więc po indeksach od n-1 w dół do 0 i dopisuj każdy napotkany znak do wyniku. Dla Coddy2026 dopisujesz 6, 2, 0, 2, y i tak dalej, co daje 6202yddoC.
Każdy znak jest odczytywany raz i zapisywany raz, więc złożoność czasowa wynosi O(n). Wynik to drugi ciąg znaków o długości n, co oznacza dodatkową złożoność pamięciową O(n).
Sposób dopisywania ma znaczenie. Dodawanie jednego znaku do niemutowalnego ciągu za pomocą + za każdym razem kopiuje cały ciąg, a dla n = 10^4 oznacza to około 5 × 10^7 kopiowanych znaków. Zbieraj znaki na liście lub w obiekcie do budowania ciągu, a następnie połącz je raz na końcu.
Algorytm
- Utwórz pustą listę lub obiekt do budowania ciągu znaków na odpowiedź.
- Wykonuj pętlę po
iodn-1do0. - Dodaj
s[i]do odpowiedzi. - Połącz elementy odpowiedzi w ciąg znaków i zwróć go.
def reverseString(s):
result = []
for i in range(len(s) - 1, -1, -1):
result.append(s[i])
return "".join(result)Zamieniaj elementy z obu końców za pomocą dwóch wskaźników
Intuicja
Odwracanie zamienia pary znaków, zaczynając od zewnętrznych i przesuwając się do środka. Pierwszy i ostatni znak zamieniają się miejscami, następnie drugi i przedostatni i tak dalej w kierunku środka. Umieść wskaźnik left na indeksie 0, a wskaźnik right na indeksie n-1, zamień miejscami oba znaki i przesuń oba wskaźniki o jeden krok do środka.
Zatrzymaj się, gdy wskaźniki się spotkają lub miną. W noon wskaźniki zaczynają na indeksach 0 i 3, następnie przesuwają się na 1 i 2, po czym się mijają — po dwóch zamianach. W przypadku nieparzystej długości, takiej jak xYz, spotykają się na środkowym znaku, który już znajduje się na swoim docelowym miejscu, więc nigdy nie zostaje dotknięty. Każda zamiana umieszcza dwa znaki na ich docelowych pozycjach, więc n / 2 zamian wystarczy, by zakończyć zadanie.
Same zamiany wymagają tylko jednej zmiennej tymczasowej, czyli dodatkowej pamięci O(1). Większość języków nie pozwala modyfikować ciągu znaków w miejscu, dlatego najpierw kopiujesz go do tablicy znaków, co wymaga O(n) pamięci. Podczas rozmowy kwalifikacyjnej, gdy dane wejściowe są już tablicą znaków, to podejście odwraca ją bez użycia dodatkowej pamięci.
Algorytm
- Skopiuj
sdo tablicy znaków. - Ustaw
left = 0iright = n-1. - Gdy
left < right, zamień miejscami znaki na pozycjachleftiright, następnie dodaj 1 dolefti odejmij 1 odright. - Przekształć tablicę z powrotem w ciąg znaków i zwróć go.
def reverseString(s):
chars = list(s)
left, right = 0, len(chars) - 1
while left < right:
chars[left], chars[right] = chars[right], chars[left]
left += 1
right -= 1
return "".join(chars)
Pułapki i przypadki brzegowe
Odwracanie wygląda jak jedna linijka, a błędy kryją się w granicach pętli i w sposobie budowania wyniku.
- Przejście pętlą po
leftaż don-1. Za środkiem każda para jest zamieniana ponownie i ciąg wraca do pierwotnej postaci. Zatrzymaj się przyleft < right. - Rozpoczęcie pętli wstecznej od
nzamiast odn-1, co powoduje odczyt pozycji poza końcem. W Lua i R indeksy biegną od1don. - Budowanie wyniku za pomocą
result = result + chdla niemodyfikowalnego ciągu znaków. Każdy krok kopiuje dotychczasowy wynik, przez co zadanie liniowe staje się kwadratowe dla długich danych wejściowych. - Zapomnienie o terminującym
'\0'w C. Bufor o rozmiarzenbajtów jest za krótki; przydzieln + 1. - Zamiana bez zmiennej tymczasowej: po
chars[left] = chars[right]poprzedni znak z lewej strony przepada, chyba że Twój język zamienia obie wartości jednocześnie.
Najczęstsze pytania4
Jaka jest złożoność czasowa odwracania ciągu znaków?
Odwracanie zajmuje O(n) czasu, ponieważ każdy znak musi zostać przeniesiony na nową pozycję i każdy jest przetwarzany tylko raz. Utworzenie nowego ciągu znaków wymaga dodatkowej pamięci rzędu O(n). Zamiana za pomocą dwóch wskaźników wymaga tylko O(1) dodatkowej pamięci, gdy znaki znajdują się już w mutowalnej tablicy.
Jak odwrócić ciąg znaków bez użycia wbudowanej funkcji odwracającej?
Skopiuj znaki do tablicy, umieść po jednym wskaźniku na każdym końcu, zamień miejscami dwa znaki i przesuwaj wskaźniki ku sobie, aż się spotkają. Alternatywnie, wykonuj pętlę od ostatniego indeksu do pierwszego i dodawaj każdy znak do obiektu budującego ciąg. Oba sposoby tworzą odwrócony ciąg w jednym przebiegu.
Czy potrafisz odwrócić ciąg znaków w miejscu?
Tylko wtedy, gdy znaki znajdują się w modyfikowalnym buforze, takim jak tablica char w C, Java lub C#, lista w Pythonie albo std::string w C++. Ciągi znaków w Javie, Pythonie, JavaScript i wielu innych językach są niemodyfikowalne, więc kopiujesz je do tablicy, zamieniasz w niej elementy miejscami i tworzysz nowy ciąg znaków. Sam krok zamiany elementów miejscami odbywa się w miejscu w obu przypadkach.
Dlaczego pętla z dwoma wskaźnikami zatrzymuje się w połowie?
Każda zamiana umieszcza dwa znaki na ich docelowych pozycjach, więc po n / 2 zamianach każdy znak znajduje się na swoim miejscu. Kontynuowanie po przekroczeniu środka zamienia te same pary z powrotem i cofa wykonaną pracę. Gdy długość jest nieparzysta, środkowy znak już znajduje się pod swoim lustrzanym indeksem i nie wymaga zamiany.
Podobne zadania
Zadania oparte na tych samych pomysłach. Rozwiązanie dwóch lub trzech utrwala schemat.
Python
def reverseString(s):
# Napisz tutaj kodPrzypadek 1
Przypadek 2
Przypadek 3
Wejście
s = "Coddy2026"
Oczekiwane
"6202yddoC"