1. StringBuilder/StringBuffer
Роҳи маъмултарин ва содда ин истифодаи StringBuilder/StringBuffer аст :public static String reverseString(String str) {
return new StringBuilder(str).reverse().toString();
}
Беҳтарин ҳалли = соддатарин. Вақте пурсиданд, ки чӣ гуна сатрро дар Java иваз кардан мумкин аст, ин аввалин чизест, ки бояд ба хотир биёяд. Аммо мо қаблан дар бораи алгоритмҳо сӯҳбат кардем, ҳамин тавр не? Биёед ба роҳҳои ҳалли он назар андозем, ки аз қуттӣ берун нестанд.
2. Ҳалли массив
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;
}
Мо бо истифода аз усули toCharArray сатри худро ба массив табдил медиҳем . Биёед як даври for-ро тавассути ин массив аз охири он иҷро кунем ва ба сатри натиҷавӣ аломатҳо илова кунем.
3. Ҳалли бо charAt
public static String reverseString(String str) {
String result = "";
for (int i = 0; i < str.length(); i++) {
result = str.charAt(i) + result;
}
return result;
}
Дар ин ҳолат, ба мо ҳатто лозим нест, ки сатрро ба массив тақсим кунем, зеро мо ҳар як аломатро бо усули синфи String - charAt истихроҷ мекунем (давраи for, боз баръакс аст, ки ба мо имкон медиҳад, ки аломатҳоро пай дар пай ба ақиб гирем).
4. Ҳалли бо Stack
Ҳеҷ кас синфи Stack- ро муддати тӯлонӣ истифода намебарад ва он кӯҳна ҳисобида мешавад, аммо бо вуҷуди ин, барои истинод, дидани ҳалли истифодаи он муфид хоҳад буд: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;
}
Дар ин ҷо боз мо toCharArray-ро барои тақсим кардани сатр ба массив истифода мебарем ва ҳамаашро дар Stack- и худ бо аломати навъи умумӣ ҷойгир мекунем . Минбаъд, мо ба гирифтани элементҳо аз болои стек шурӯъ мекунем. Аз сабаби хусусияти стек ҳамчун сохтори LIFO - Аввалан I n F irst Out (аввал дар, охирин берун), элементҳо ба ақиб гирифта мешаванд ва натиҷа дар сатри натиҷавӣ нигоҳ дошта мешавад.
5. Ҳалли тавассути рекурсия
Қариб ҳар як масъалаи алгоритмиро бо истифода аз рекурсия ҳал кардан мумкин аст. Ва дар ин ҷо мо низ бе вай кор карда наметавонем. Ё ҳатто бе онҳо. Охир, имруз мо на танхо як усули халли рекурсия, балки якчанд усулро дида мебароем.-
усули якум
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); }
Мо тағирёбандаҳои rightStr ва leftStr-ро барои тақсим кардани сатри воридотӣ ба ду қисмати баробар истифода мебарем. Баъдан, бо истифода аз ин тақсим, мо сатрро ба хурдтарин қисмҳои тақсимшаванда тақсим мекунем (1 аломат). Пас аз он, рекурсия вайрон шуданро оғоз мекунад ва аломатҳоро бо тартиби муқобил бармегардонад (онҳое, ки дар тарафи рост буданд, дар тарафи чап ҷойгир карда шуданд; онҳое, ки дар тарафи чап буданд, дар тарафи рост ҷойгир карда шуданд)
Мо набояд фаромӯш кунем, ки ҳар як рекурсия як даъвати чандкарата ба усул ва дар натиҷа, сарфи зиёди захираҳо мебошад. Хуб, агар мо дар бораи рекурсия бо ҳолати дастнорас баромад кунем, пас ин роҳи беохир ва StackOverflowError аст.
-
усули дуюм
Дар ин ҷо ба мо як далели иловагӣ дар метод лозим аст - индекс.
Вақте ки ин усул иҷро мешавад, ба он дарозии сатри -1 дода мешавад:
String str = "JavaRush forever"; System.out.println(reverseString(str, str.length()-1));
Ва худи усул:
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); }
Индекси мо ҳамчун нишондиҳандаи он аст, ки мо ҳоло кадом унсури сатрро истифода хоҳем кард (ва мо элементҳоро аз охири истифода хоҳем бурд).
Аз ин рӯ, мо шартҳои баромаданро вақте муқаррар мекунем, ки индекс ба унсури аввал мерасад.
- усули сеюм
public static String reverseString(String str) { if (str.length() <= 1) { return str; } return reverseString(str.substring(1)) + str.charAt(0); }
Ин усул аслан соддатарин аз рекурсивӣ мебошад. Ва тавре ки мо дар хотир дорем, оддӣ = беҳтарин.
Дар давоми ҳар як иҷро, мо як сатрро муайян мекунем, аммо бе унсури аввал. Вақте ки ба ҳолати баромадан ба даст меояд (вақте ки мо як аломат боқӣ мондем), рекурсия ба вайроншавӣ оғоз мекунад ва аломати қаблии истифоданашуда ба ҳар натиҷаи минбаъда илова карда мешавад.
Мо арзишҳои бо истифода аз индекси ҳарф гирифташударо бо натиҷаи иҷрои қаблии усул илова мекунем ва натиҷаро бармегардонем.
6. Истифодаи XOR
XOR як амалиёти мантиқии бит аст. Дар мавриди ду тағирёбанда, натиҷаи амалиёт дуруст аст, агар ва танҳо дар сурате, ки яке аз аргументҳо дуруст ва дигаре нодуруст бошад.А | Б | Я |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
(A XOR B) XOR B = A
(A XOR B) XOR A = B
Усул чӣ гуна хоҳад буд:
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;
}
Биёед бифаҳмем, ки дар ин ҷо чӣ рӯй медиҳад. Мо аз сатри воридотӣ массив эҷод мекунем. Мо ду тағирёбандаро эҷод мекунем, паст ва баланд , ки индексҳоро барои гузаштан аз массив нигоҳ медоранд. Мутаносибан, яке аз аввал то ба охир ҳаракат хоҳад кард - мо ба он арзиши 0, дуюм - аз охир ба аввал, мо онро arr.length - 1 муқаррар мекунем . Мо ба ҳалқае ворид мешавем, ки то он даме, ки шохиси баланд аз паст аст, бозӣ хоҳад кард . Дар ин ҷо чизҳои шавқовар ба амал меоянд - истифодаи истисноии OR. Биёед мисоли x ва y-ро дида бароем . Фарз мекунем, ки arr[баланд] = 'x'; Рамзи дуии он 1 1 1 1 0 0 0 хоҳад буд Дар айни замон arr[баланд] = 'n'; Рамзи дуӣ - 1 1 0 1 1 1 0 Он чизе ки мо дар амалиёти XOR дар як давр хоҳем дошт:
-
arr[паст] = (чар) (arr[паст] ^ арр[баланд]);
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[баланд] = (чар) (arr[паст] ^ арр[баланд]);
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[паст] = (чар) (arr[паст] ^ арр[баланд]);
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