JavaRush /Блоги Java /Random-TG /Сатри баръакс дар Java: омӯхтани баргардонидани сатрҳо бо...

Сатри баръакс дар Java: омӯхтани баргардонидани сатрҳо бо роҳҳои гуногун

Дар гурӯҳ нашр шудааст
Оё бе донистани алгоритмҳо барномасози хуб шудан мумкин аст? Хеле, хеле баҳснок. Бале, шумо метавонед дар ширкатҳои аутсорсинги мо кор пайдо кунед, зеро ҳангоми мусоҳиба онҳо бештар дар бораи технология савол медиҳанд. Сатри баръакс дар Java: омӯхтани баргардонидани сатрҳо бо роҳҳои гуногун - 1Аммо оё шумо мутахассиси хуб мешавед, агар қарорҳои шумо бо асобагон пур шаванд? Агар шумо хоҳед, ки ба як ширкати ҷиддии хориҷӣ гузаред, шумо бо мусоҳибаҳое дучор мешавед, ки асосан ба алгоритмҳо нигаронида шудаанд. Бо ин ё он роҳ, қабул кардани алгоритмҳои асосӣ бамаврид аст, зеро алгоритм дӯсти барномасоз аст . Имрӯз мо ба яке аз ин мавзӯъҳо дахл карда, роҳҳои баргардонидани сатрро баррасӣ хоҳем кард. Дар ин ҷо ҳама чиз оддӣ аст. Баргардонидани сатр ин ба ақиб гирифтани сатр аст. Масалан: JavaRush forever ->reverof hsuRavaJ Пас, чӣ гуна шумо метавонед сатрро дар Java баргардонед?

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 дар як давр хоҳем дошт:
  1. 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
  2. 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
  3. 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
Дар натиҷа, ба шарофати ин амалҳо, мо арзишҳои ду ҳуҷайраи массивиро иваз кардем. arr[баланд] ҳамон қадар элементҳо аз охири массив аст, чунон ки arr[паст] аз аввал аст. Аз ин рӯ, мо танҳо элементҳоро бо ин индексҳо иваз мекунем. Масалан, ҳангоми иҷрои якум дар ҷумлаи "JavaRush ҳамеша" J ва r иваз карда мешаванд, дар дуюм - a ва e , ва ғайра. миёна, мо аз ҳалқа партофта мешавад (яъне зарурати иваз кардани унсури миёна вуҷуд надорад). Агар он баробар бошад, пас аз коркарди ҳамаи элементҳо мо хориҷ карда мешавем. Хуб, пас аз ин мо ба як ҳалқаи муқаррарӣ мегузарем ва аз элементҳои массив сатр месозем.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION