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.

  • 🔘 Temel durum: isEmpty() fonksiyonu, tersine çevrilecek hiçbir şey kalmadığını bildirdiğinde yöntem hemen geri döner.
  • ☑️ Özyinelemeli adım: substring(1) ilk karakteri kaldırır ve charAt(0) ters çevrilmiş kalanın ardından onu geri koyar.
  • Değişmezlik: Her çağrı yeni bir String nesnesi üretir, çünkü Java Metin asla yerinde düzenlenemez.
  • 🧪 Trace: Guru99, her karakter için birer çağrı ve boş taban durumu için bir çağrı olmak üzere yedi çağrıdan sonra 99uruG olur.
  • Daha hızlı seçenekler: StringBuilder.reverse() ve toCharArray() üzerinde iki işaretçili takas işlemi, her ikisi de tek geçişte tamamlanır.
  • 📌 Tutar: `substring()` ile özyinelemeli işlem karesel zaman alır ve karakter başına bir yığın çerçevesi tutar.

Java Özyinelemeli bir yöntem kullanarak bir dizeyi tersine çeviren program

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ımyStrSonraki görüşmeye aktarıldı.Bitmeyi bekleyen ifade
1Guru99uru99reverseString(“uru99”) + G
2uru99ru99reverseString(“ru99”) + u
3ru99u99reverseString(“u99”) + r
4u9999reverseString(“99”) + u
5999reverseString(“9”) + 9
69(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şımZamanFazladan boşlukNeden Şimdi
substring() ile özyinelemeO(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çiO (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.

SSS

Dize nesneleri değiştirilemezdir, bu nedenle bir dizenin içindeki karakterler oluşturulduktan sonra asla değişmez. Bu nedenle her tersine çevirme işlemi yeni bir nesne oluşturur. Karakterlerin her adımda yeni bir dize tahsis etmeden değiştirilmesi gerektiğinde StringBuilder veya karakter dizisi kullanın.

isEmpty() metoduna yapılan ilk çağrı, hiçbir şey üzerinde çağrılmadığı için NullPointerException hatası verir. Özyineleme başlamadan önce, giriş noktasını null döndüren veya IllegalArgumentException hatası veren bir null kontrolüyle koruyun.

Güvenilir değil. `charAt()` 16 bitlik kod birimleri üzerinde çalışır, bu nedenle vekil çift olarak saklanan bir karakter bölünür ve ters çevrilmiş metinde yerine geçen kareler gösterilir. `StringBuilder.reverse()` vekil çiftleri bir arada tutar, bu da onu Unicode metin için daha güvenli bir seçenek haline getirir.

Hemen hemen her durumda StringBuilder kullanılır. İkisi de aynı reverse() yöntemini sunar, ancak StringBuffer Her çağrıyı senkronize eder, bu da hızı düşürür. Dize SeçinBuffer Bu durum yalnızca bir arabellek gerçekten iş parçacıkları arasında paylaşıldığında geçerlidir.

Cümleyi split(" ") ile boşluklara göre ayırın, ardından elde edilen diziyi son indeksten ilkine doğru dolaşarak her kelimeyi bir StringBuilder'a ekleyin. Her kelimenin içindeki karakterler orijinal sıralarında kalır.

Her karakter için bir yığın çerçevesi kullanılır, bu nedenle StackOverflowError hatası görünmeden önce birkaç bin karakter geçmesi tipiktir. Tam sınır, JVM iş parçacığı yığın boyutuna bağlıdır. Herhangi bir yinelemeli sürüm, bu sınırı tamamen aşar.

Yapay zekâ asistanı bir yığın veriyi okuyabilir. tracÖrneğin, eksik veya ulaşılamayan bir temel durumu işaret edin ve çerçevelerin hangi sırayla açıldığını açıklayın. Ayrıca boş, tek karakterli ve null girişler için uç durum testleri taslağı hazırlayın. Akıl yürütmeyi gerçek bir çalıştırma ile doğrulayın.

Evet. Yardımcı pilot Genellikle yalnızca imza kısmından yola çıkarak tüm ters metodu tamamlar ve çoğu zaman önce StringBuilder formunu sunar. Temel durumu ve karmaşıklığı kontrol edin, çünkü en kısa öneri her zaman bir alıştırmanın istediği sürüm olmayabilir.

Bu yazıyı şu şekilde özetleyin: