JavaRush /Blog Jawa /Random-JV /Senar mbalikke ing basa Jawa: sinau mbalikke senar kanthi...

Senar mbalikke ing basa Jawa: sinau mbalikke senar kanthi cara sing beda-beda

Diterbitake ing grup
Apa bisa dadi programer sing apik tanpa ngerti algoritma? Banget, banget kontroversial. Ya, sampeyan bisa nemokake proyek ing perusahaan outsourcing kita, amarga nalika wawancara biasane takon babagan teknologi. Reverse string in Java: learning to reverse strings in different ways - 1Nanging apa sampeyan bakal dadi spesialis sing apik yen keputusan sampeyan diisi kruk? Yen sampeyan pengin pindhah menyang perusahaan asing sing luwih serius, sampeyan bakal nemokake wawancara sing utamane fokus ing algoritma. Salah siji cara utawa liyane, iku worth nggunakake algoritma paling dhasar, amarga algoritma iku kanca programmer . Dina iki kita bakal ndemek salah sawijining topik kasebut lan ngrembug babagan cara mbalikke senar. Kabeh iku prasaja ing kene. Mbalikake senar iku ndadekake senar mundur. Contone: JavaRush forever ->reverof hsuRavaJ Dadi, kepiye sampeyan bisa mbalikke string ing Jawa?

1. StringBuilder / StringBuffer

Cara sing paling umum lan prasaja yaiku nggunakake StringBuilder/StringBuffer :
public static String reverseString(String str) {
  return new StringBuilder(str).reverse().toString();
}
Solusi paling apik = paling gampang. Nalika ditakoni carane mbalikke senar ing Jawa, iki minangka bab pisanan sing kudu dipikirake. Nanging kita ngomong babagan algoritma sadurunge, ta? Ayo goleki solusi sing ora metu saka kothak.

2. solusi Array

public static String reverseString(String str) {
  char[] array = str.toCharArray();
  String result = "";
  for (int i = array.length - 1; i >= 0; i--) {
     result = result + array[i];
  }
  return result;
}
Kita ngowahi string kita dadi array nggunakake metode toCharArray . Ayo dadi mbukak kanggo daur ulang liwat Uploaded iki saka mburi, nambah karakter kanggo senar asil ing sadawane dalan.

3. Solusi karo charAt

public static String reverseString(String str) {
  String result = "";
  for (int i = 0; i < str.length(); i++) {
     result = str.charAt(i) + result;
  }
  return result;
}
Ing kasus iki, kita malah ora kudu pamisah string menyang Uploaded, amarga kita extract saben karakter nggunakake String metode kelas - charAt (ing kanggo daur ulang, maneh, mbalikke, sing ngidini kita kanggo njupuk karakter sequentially mundur).

4. Solusi karo Stack

Kelas Stack wis suwe ora digunakake, lan dianggep lungse, nanging, kanggo referensi, bakal migunani kanggo ndeleng solusi nggunakake:
public static String reverseString(String str) {
  Stack<Character> stack = new Stack<>();
  String result = "";
  for (Character character : str.toCharArray()) {
     stack.add(character);
  }
  while (!stack.isEmpty()) {
     result = result + stack.pop();
  }
  return result;
}
Ing kene maneh kita nggunakake toCharArray kanggo pamisah string menyang array lan sijine kabeh ing Stack kita karo karakter jinis generik . Sabanjure, kita miwiti njupuk unsur saka ndhuwur tumpukan. Amarga sifat tumpukan minangka struktur LIFO - L minangka I n F pisanan O ut (pisanan ing, pungkasan metu), unsur bakal dijupuk mundur lan asil bakal disimpen ing baris asil.

5. Solusi kanthi rekursi

Meh saben masalah algoritma bisa ditanggulangi kanthi nggunakake rekursi. Lan ing kene kita uga ora bisa nindakake tanpa dheweke. Utawa malah tanpa wong-wong mau. Sawise kabeh, dina iki kita bakal nimbang ora mung siji cara kanggo ngatasi recursion, nanging sawetara.
  • metode siji

    public static String reverseString(String str) {
      String rightStr;
      String leftStr;
      int length = str.length();
    
      if (length <= 1) {
         return str;
      }
    
      leftStr = str.substring(0, length / 2);
      rightStr = str.substring(length / 2, length);
    
      return reverseString(rightStr) + reverseString(leftStr);
    }

    Kita nggunakake variabel rightStr lan leftStr kanggo pamisah string mlebu dadi rong bagean sing padha. Sabanjure, nggunakake pamisah iki, kita pamisah senar menyang bagean paling cilik dibagi (1 karakter). Sawisé iku, rekursi wiwit ambruk, ngasilake karakter ing urutan ngelawan (sing ana ing sisih tengen diselehake ing sisih kiwa, sing ana ing sisih kiwa diselehake ing sisih tengen)

    Kita ora kudu lali yen saben rekursi minangka panggilan kaping pirang-pirang menyang metode, lan minangka asil, mbuwang sumber daya sing akeh. Ya, yen kita ngomong babagan rekursi kanthi kondisi metu sing ora bisa ditindakake, mula iki minangka dalan menyang tanpa wates lan menyang StackOverflowError.

  • cara loro

    Ing kene kita butuh argumen tambahan ing metode - indeks.

    Nalika cara iki ditindakake, diwenehi dawa string -1:

    String str = "JavaRush forever";
    System.out.println(reverseString(str, str.length()-1));

    Lan cara dhewe:

    public static String reverseString(String str, int index) {
      if(index == 0){
         return str.charAt(0) + "";
      }
    
      char letter = str.charAt(index);
      return letter + reverseString(str, index-1);
    }

    Indeks kita minangka indikator unsur baris sing bakal digunakake saiki (lan kita bakal nggunakake unsur kasebut saka pungkasan).

    Mulane, kita nyetel kondisi metu nalika indeks tekan unsur pisanan.

  • Kita nambah nilai sing dipikolehi nggunakake indeks huruf kanthi asil eksekusi metode sadurunge lan ngasilake asil.

  • cara telu

    public static String reverseString(String str) {
      if (str.length() <= 1) {
         return str;
      }
      return reverseString(str.substring(1)) + str.charAt(0);
    }

    Cara iki ateges sing paling gampang saka rekursif. Lan kita elinga, prasaja = paling apik.

    Sajrone saben roto, kita nemtokake senar padha, nanging tanpa unsur pisanan. Nalika kondisi metu wis tekan (nalika kita duwe siji karakter kiwa), recursion wiwit ambruk, lan karakter sing ora digunakake sadurunge bakal ditambahake kanggo saben asil sakteruse.

6. Nggunakake XOR

XOR minangka operasi bitwise logis. Ing kasus rong variabel, asil operasi bener yen lan mung yen salah siji argumen bener lan liyane salah.
A B Y
0 0 0
0 1 1
1 0 1
1 1 0
Sampeyan bisa maca liyane babagan operasi bitwise ing artikel iki . Solusi sabanjure bakal gumantung ing kasunyatan sing:

(A XOR B) XOR B = A
(A XOR B) XOR A = B
Apa cara bakal katon kaya:
public static String reverseString(String str) {
  char[] arr = str.toCharArray();
  int low = 0;
  int high = arr.length - 1;
  String result = "";
  while (low < high) {
     arr[low] = (char) (arr[low] ^ arr[high]);
     arr[high] = (char) (arr[low] ^ arr[high]);
     arr[low] = (char) (arr[low] ^ arr[high]);
     low++;
     high--;
  }
  for (int i = 0; i < arr.length; i++) {
     result = result + arr[i];
  }
  return result;
}
Ayo ngerteni apa sing kedadeyan ing kene. Kita nggawe array saka senar sing mlebu. Kita nggawe rong variabel, rendah lan dhuwur , sing nyimpen indeks kanggo ngliwati array. Patut, siji bakal pindhah saka awal kanggo mburi - kita menehi nilai 0, kaloro - saka mburi kanggo awal, kita nyetel arr.length - 1 . Kita ngetik daur ulang sing bakal diputer anggere indeks dhuwur luwih saka kurang . Ing kene kedadeyan sing nyenengake - panggunaan eksklusif UTAWA. Ayo katon ing x lan y minangka conto . Misal arr[dhuwur] = 'x'; Kode binar bakal dadi 1 1 1 1 0 0 0 Ing wektu iki arr[dhuwur] = 'n'; Kode biner - 1 1 0 1 1 1 0 Apa sing bakal ditindakake ing operasi XOR ing loop:
  1. arr[cendhek] = (char) (arr[cendhek] ^ arr[dhuwur]);

    
    arr[low] = 1 1 0 1 1 1 0
    arr[high] =1 1 1 1 0 0 0
    arr[low] = 0 0 1 0 1 1 0
  2. arr[dhuwur] = (char) (arr[cendhek] ^ arr[dhuwur]);

    
    arr[low] =  0 0 1 0 1 1 0
    arr[high] = 1 1 1 1 0 0 0
    arr[high] = 1 1 0 1 1 1 0
  3. arr[cendhek] = (char) (arr[cendhek] ^ arr[dhuwur]);

    
    arr[low] =  0 0 1 0 1 1 0
    arr[high] = 1 1 0 1 1 1 0
    arr[low] =  1 1 1 1 0 0 0
Akibaté, amarga operasi kasebut, kita ngganti nilai rong sel array. arr [dhuwur] minangka akeh unsur saka mburi array minangka arr [kurang] saka wiwitan. Mulane, kita mung ngganti unsur karo indeks kasebut. Contone, ing eksekusi pisanan ing ukara "JavaRush salawas-lawase" J lan r bakal diganti, ing kaloro - a lan e , etc. Yen kita duwe nomer ganjil saka karakter, banjur nalika kita tekan unsur sing ana ing tengah, kita bakal dibuwang metu saka daur ulang (i.e. Ana ora perlu kanggo ngganti unsur tengah). Yen malah, kita bakal dibuwang sawise ngolah kabeh unsur. Inggih, sawise iku kita pindhah menyang daur ulang biasa lan mbangun senar saka unsur array.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION