Reverse a String
Kamu mendapatkan string s yang terdiri dari huruf dan angka. Kembalikan string baru dengan karakter yang sama dalam urutan terbalik, sehingga karakter terakhir berada di awal dan karakter pertama berada di akhir. Pertahankan setiap karakter persis seperti semula, termasuk huruf besar atau kecilnya.
Fungsi
- sstring
- string yang akan dibalik
- Mengembalikanstring
- karakter-karakter s dalam urutan terbalik
Batasan
1 ≤ s.length ≤ 104shanya berisi huruf Inggris (asampaiz,AsampaiZ) dan digit (0sampai9).
Contoh
- Input
- s = "Coddy2026"
- Output
- "6202yddoC"
- Penjelasan
- Baca
Coddy2026dari karakter terakhir hingga karakter pertama:6,2,0,2, laluy,d,d,o, dan terakhir huruf kapitalC.
- Input
- s = "noon"
- Output
- "noon"
- Penjelasan
noonadalah palindrom, jadi kebalikannya adalah kata yang sama. Hurufndi bagian luar bertukar tempat, lalu kedua hurufojuga.
- Input
- s = "Q"
- Output
- "Q"
- Penjelasan
- String yang terdiri dari satu karakter tidak memiliki apa pun untuk ditukar, jadi string itu dikembalikan tanpa perubahan.
Pertanyaan lanjutan
Bagaimana cara membalik urutan kata dalam sebuah kalimat, mengubah hello big world menjadi world big hello, sementara setiap kata tetap mempertahankan urutan hurufnya?
Petunjuk
Buka satu per satu. Setiap petunjuk mengungkap sedikit lebih banyak.
Karakter pada indeks
0berakhir di posisi terakhir dalam jawaban. Di mana karakter pada indeksiberakhir?Karakter berpindah ke indeks
n-1-i. Karakter pertama dan terakhir bertukar tempat, lalu karakter kedua dan kedua dari belakang, dan seterusnya menuju bagian tengah.Salin string ke dalam array karakter. Pertahankan satu indeks di awal dan satu di akhir, tukar kedua karakter, lalu geser kedua indeks ke arah dalam hingga bertemu. Kemudian gabungkan kembali array menjadi string.
Solusi
Setiap karakter memiliki tujuan tetap: karakter pada indeks i harus berada pada indeks n-1-i. Kamu bisa menulis karakter ke dalam string baru dengan urutan tersebut, atau menukarnya secara berpasangan dari kedua ujung. Versi dengan pertukaran adalah yang biasa ditanyakan pewawancara, karena pergerakan dua pointer yang sama membalik array langsung di tempat dan memeriksa palindrom.
Salin karakter dari bagian belakang
Intuisi
Pembalikan dimulai dari karakter terakhir dan berakhir pada karakter pertama, jadi lakukan perulangan dengan indeks dari n-1 turun hingga 0, lalu tambahkan setiap karakter ke jawaban. Setiap karakter dibaca sekali dan ditulis sekali: waktu O(n), ditambah string jawaban berukuran O(n).
Tambahkan karakter ke list atau string builder, lalu gabungkan sekali di akhir. Menambahkan satu karakter ke string immutable dengan + menyalin seluruh string setiap kali, sekitar 5 × 10^7 penyalinan karakter untuk n = 10^4.
Algoritma
- Buat list kosong atau string builder untuk jawabannya.
- Lakukan perulangan
idarin-1turun hingga0. - Tambahkan
s[i]ke jawaban. - Gabungkan jawaban menjadi string, lalu kembalikan.
def reverseString(s):
result = []
for i in range(len(s) - 1, -1, -1):
result.append(s[i])
return "".join(result)Tukar dari kedua ujung dengan dua pointer
Intuisi
Karakter pertama dan terakhir bertukar tempat, lalu karakter kedua dan kedua dari belakang, dan seterusnya menuju tengah. Letakkan left pada indeks 0 dan right pada n-1, tukar, lalu geser keduanya ke arah tengah sampai bertemu atau berpapasan. Setiap pertukaran menempatkan dua karakter di posisi akhirnya, jadi n / 2 pertukaran sudah cukup. Untuk panjang ganjil seperti xYz, karakter tengah sudah berada di posisinya dan tidak pernah disentuh.
Pertukaran ini membutuhkan satu variabel sementara. Sebagian besar bahasa tidak dapat mengubah string secara langsung, jadi kamu harus menyalinnya terlebih dahulu ke dalam array karakter, yang membutuhkan O(n). Jika input sudah berupa array yang dapat diubah, pembalikan menggunakan ruang tambahan O(1).
Algoritma
- Salin
ske dalam array karakter. - Tetapkan
left = 0danright = n-1. - Selama
left < right, tukar karakter padaleftdanright, lalu tambahkan 1 keleftdan kurangi 1 dariright. - Ubah array kembali menjadi string dan kembalikan.
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)
Jebakan dan kasus tepi
- Melakukan perulangan pada
leftsampai ken-1. Setelah melewati bagian tengah, setiap pasangan ditukar kembali, sehingga string kembali tanpa perubahan. Berhenti saatleft < right. - Memulai perulangan mundur dari
n, bukann-1, sehingga membaca satu posisi melewati akhir. Di Lua dan R, indeks dimulai dari1hinggan. - Lupa menambahkan
'\0'sebagai terminator di C. Buffer berukurannbyte kurang satu, alokasikann + 1. - Menukar tanpa variabel sementara. Setelah
chars[left] = chars[right], karakter lama di posisi kiri hilang, kecuali bahasa yang kamu gunakan menukar kedua nilai sekaligus.
Pertanyaan yang sering diajukan3
Berapa kompleksitas waktu untuk membalik string?
Membalik string memerlukan waktu O(n), karena setiap karakter harus berpindah ke posisi baru dan diproses satu kali. Membuat string baru memerlukan ruang tambahan sebesar O(n). Menukar karakter dengan dua pointer hanya memerlukan ruang tambahan sebesar O(1) jika karakter sudah berada dalam array yang bisa diubah.
Bagaimana cara membalik string tanpa fungsi reverse bawaan?
Salin karakter ke dalam array, tempatkan satu pointer di setiap ujung, tukar kedua karakter, lalu gerakkan pointer saling mendekat hingga bertemu. Sebagai alternatif, lakukan perulangan dari indeks terakhir ke indeks pertama dan tambahkan setiap karakter ke builder. Keduanya menghasilkan string terbalik dalam satu kali lintasan.
Bisakah kamu membalik string secara langsung?
Hanya jika karakter berada dalam buffer yang dapat diubah, seperti array char di C, Java, atau C#, list di Python, atau std::string di C++. string di Java, Python, dan JavaScript tidak dapat diubah, jadi salin string tersebut ke dalam array, tukar karakter di sana, lalu buat string baru.
Soal serupa
Soal yang memakai ide yang sama. Mengerjakan dua atau tiga di antaranya membuat polanya melekat.
def reverseString(s):
# Tulis kodemu di siniTes #1
Tes #2
Tes #3
Argumen
s = "Coddy2026"
Output yang diharapkan
"6202yddoC"