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.
- 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.
Kita nambah nilai sing dipikolehi nggunakake indeks huruf kanthi asil eksekusi metode sadurunge lan ngasilake asil.
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 |
(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:
-
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
-
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
-
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
GO TO FULL VERSION