nasıl Reverse bir Dize Java Özyinelemeyi kullanma
⚡ Akıllı Özet
Revbir dizeyi değiştirme Java Özyinelemeli fonksiyonlar, ilk karakteri ayıklayarak, geriye kalanları tersine çevirerek ve bu ilk karakteri sona ekleyerek çalışır. Boş bir dize, çağrıları durdurur ve yığını geri sarar.
Bu örnek programda kullanıcı tarafından girilen bir stringi ters çevireceğiz.
Bir stringi tersine çevirecek bir fonksiyon yaratacağız. Later Tüm karakterler tersine çevrilene kadar bunu özyinelemeli olarak çağıracağız. Özyineleme bu probleme uygundur çünkü tersine çevrilmiş bir dize, orijinal ilk karakterin sona eklenmiş halinin tersine çevrilmiş kuyruğudur; bu da aynı problemin bir karakter daha küçük halidir.
Yaz Java Programı Reverse dizi
Aşağıdaki sınıf, main() metodunda girdiyi tanımlar, reverseString() metoduna iletir ve geri gelen sonucu yazdırır. Metodun içindeki iki println() çağrısı, her özyinelemeli adımı konsolda görünür hale getirir.
package com.guru99; public class ReverseString { public static void main(String[] args) { String myStr = "Guru99"; //create Method and pass and input parameter string String reversed = reverseString(myStr); System.out.println("The reversed string is: " + reversed); } //Method take string parameter and check string is empty or not public static String reverseString(String myStr) { if (myStr.isEmpty()){ System.out.println("String in now Empty"); return myStr; } //Calling Function Recursively System.out.println("String to be passed in Recursive Function: "+myStr.substring(1)); return reverseString(myStr.substring(1)) + myStr.charAt(0); } }
Code Çıktı:
Çıktının her satırı bir özyinelemeli çağrıdır. Her satırda yazdırılan son kısım, bir önceki satırdakinden bir karakter daha kısadır ve son satır ters çevrilmiş sonucu gösterir.
String to be passed in Recursive Function: uru99 String to be passed in Recursive Function: ru99 String to be passed in Recursive Function: u99 String to be passed in Recursive Function: 99 String to be passed in Recursive Function: 9 String to be passed in Recursive Function: String in now Empty The reversed string is: 99uruG
Özyinelemeli Nasıl RevGenel Çalışmalar Adım Adım
İki satır tüm metodu kapsar. Temel durum, `if (myStr.isEmpty())`, özyinelemenin duracağı bir nokta belirler. Özyinelemeli satır, `return reverseString(myStr.substring(1)) + myStr.charAt(0),` işi ikiye böler: `substring(1)` ilk karakterden sonraki her şeydir ve `charAt(0)` ise o ilk karakterin sonuna eklenmiş halidir. sonra Ters kalan.
Tracgirdiyi Guru99, sırayı netleştiriyor. Java Birleştirme işlemi gerçekleşmeden önce her çağrı için bir kare gönderir:
| Çağrı | myStr | Sonraki görüşmeye aktarıldı. | Bitmeyi bekleyen ifade |
|---|---|---|---|
| 1 | Guru99 | uru99 | reverseString(“uru99”) + G |
| 2 | uru99 | ru99 | reverseString(“ru99”) + u |
| 3 | ru99 | u99 | reverseString(“u99”) + r |
| 4 | u99 | 99 | reverseString(“99”) + u |
| 5 | 99 | 9 | reverseString(“9”) + 9 |
| 6 | 9 | (boş) | reverseString(“”) + 9 |
| 7 | (boş) | temel duruma ulaşıldı | boş dize döndürür |
Ardından yığın aşağıdan yukarıya doğru açılır ve her kare kaydedilmiş karakterini ekler: boş dize 9 olur, sonra 99, sonra 99u, 99ur, 99uru ve nihayet 99uruG. çünkü Java Dizeler değiştirilemezdir; bu ara değerlerin hiçbiri bir öncekini geçersiz kılmaz; her birleştirme işlemi yeni bir String nesnesi oluşturur.
Konsol çıktısındaki iki ayrıntıyı belirtmekte fayda var. Altıncı satır, iki nokta üst üste işaretinden sonra hiçbir şeyle bitmiyor, çünkü tek karakterli bir dizede substring(1) boş dizeyi döndürüyor, null değil. Bunu takip eden mesaj orijinal programda "Dize artık boş" şeklindedir; bu ifade "Dize artık boş" için bir yazım hatasıdır ve kod ile yukarıdaki çıktının satır satır eşleşmesi için olduğu gibi bırakılmıştır.
Diğer Yollar Reverse bir Dize Java
Özyineleme, en açık yöntemdir. görmek Tersine çevirme işlemleri gerçekleşebilir, ancak üretim kodunda nadiren bu şekilde yapılır. Üç alternatif neredeyse her gerçek durumu kapsar.
1. StringBuilder.reverse() En kısa ve en hızlı olanıdır. Sınıf, yerleşik bir reverse() metoduna sahiptir, bu nedenle tüm işlem tek bir satıra sığar:
String reversed = new StringBuilder(myStr).reverse().toString();
2. charAt() fonksiyonu içeren bir for döngüsü Diziyi son indeksten sıfıra doğru geriye doğru tarar. Mülakatçılar genellikle bu sürümü ister çünkü mantığı devretmek yerine gösterir:
String reversed = ""; for (int i = myStr.length() - 1; i >= 0; i--) { reversed = reversed + myStr.charAt(i); }
3. toCharArray() üzerinde iki işaretçili takas Diziyi karakter dizisine dönüştürür, ardından işaretçiler ortada buluşana kadar en dıştaki karakterleri içe doğru değiştirir:
char[] chars = myStr.toCharArray(); int left = 0; int right = chars.length - 1; while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left++; right--; } String reversed = new String(chars);
Aynı dizi tekniği, sayısal bir diziyi veya herhangi bir sıralı koleksiyonu tersine çevirir; bu nedenle de karşımıza çıkar. Java dizi Egzersizleri tıpkı yaylı çalgılar egzersizlerinde olduğu gibi sık sık yapın.
Her Yaklaşımın Zaman ve Mekan Karmaşıklığı
Dört versiyonun maliyeti aynı değil. Aşağıdaki iki ikinci dereceden denklem girişinin ortak bir nedeni var: her adımda yepyeni bir Dize oluşturuyorlar ve n karakteri n kez kopyalamak n karelik bir iş anlamına geliyor.
| Yaklaşım | Zaman | Fazladan boşluk | Neden Şimdi |
|---|---|---|---|
| substring() ile özyineleme | O(n²) | O(n²) | substring() fonksiyonu her çağrıldığında kalan karakterleri kopyalar ve her karakter için bir yığın çerçevesi tutulur. |
| charAt() ve + ile for döngüsü | O(n²) | O(n²) | Her birleştirme işlemi yeni bir Dize oluşturur ve şimdiye kadar toplanan her şeyi kopyalar. |
| StringBuilder.reverse() | O (n) | O (n) | Tek bir değiştirilebilir tampon, tek bir geçiş ve vekil çiftler bozulmadan korunur. |
| toCharArray() üzerinde iki işaretçi | O (n) | O (n) | Bir dizi kopyalama, ardından başka tahsis yapılmadan n/2 takas işlemi. |
Öğrenmek veya çağrı yığınının nasıl davrandığını göstermek için özyinelemeli sürümü, mülakatçı mantığı elle yazmanızı istediğinde karakter dizisi sürümünü ve piyasaya sürülen her şeyde StringBuilder.reverse() yöntemini seçin. Öğretim çözümü ile üretim çözümü arasındaki aynı denge, klasik alıştırmaların tamamında da karşımıza çıkar. kabarcık sıralaması ve Fibonacci serisi için asal sayı kontrolleriHer birinde pratik yapmaya değer. Java her iki şekilde de.
