JavaRush /Блоги Java /Random-TG /Таҳлили саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари ...

Таҳлили саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java. Қисми 13

Дар гурӯҳ нашр шудааст
Салом!
Ҳаракат ба сӯи ҳадаф, пеш аз ҳама, ҳаракат аст.
Аз ин рӯ, танҳо фикр кардан кофӣ нест, ки шумо мехоҳед чизеро ба даст оред. Шумо бояд кореро анҷом диҳед - ҳатто қадамҳои хурдтарин - аммо онҳоро ҳар рӯз иҷро кунед ва танҳо бо ин роҳ шумо ба ҳадафи ниҳоӣ хоҳед расид. Ва азбаски шумо дар ин ҷо барои таҳиягарони Java ҳастед, шумо бояд ҳар рӯз ҳадди аққал як қадами ҳадди ақал барои амиқтар кардани дониши худ дар бораи Java гузоред. Барои қадами имрӯзаи Java, ман ба шумо тавсия медиҳам, ки бо қисми нави таҳлor саволҳои маъмултарини мусоҳиба барои таҳиягарон шинос шавед. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 13-1Имрӯз мо қисми амалии саволҳоро барои мутахассисони ҷавон мегузарем. Вазифаи амалӣ дар мусоҳиба хеле кам нест. Муҳим аст, ки дар чунин вазъият гум нашавед, кӯшиш кунед, ки сари сард нигоҳ доред ва ҳалли беҳтаринро пешниҳод кунед, ё ҳатто якчанд. Ман инчунин тавсия медиҳам, ки ҳангоми ҳалли мушкилот хомӯш набошед, балки дар бораи қатори тафаккури худ шарҳ диҳед ва роҳи ҳалли онро нависед ё пас аз навиштан, бо сухан фаҳмонед, ки чӣ кор кардед ва чаро. Ин шуморо ба мусоҳиба бештар аз тасмими хомӯшона дӯст медорад. Пас биёед оғоз кунем!

111. Мубодилаи маълумот байни риштањо чї тавр сурат мегирад?

Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 13-2Барои мубодилаи маълумот байни риштаҳо, шумо метавонед бисёр равишҳо ва воситаҳои гуногунро истифода баред: масалан, тағирёбандаҳои атомӣ, коллексияҳои ҳамоҳангшуда ва семафорро истифода баред. Аммо барои ҳалли ин мушкилот ман бо Exchanger мисол хоҳам дод . Мубодила синфи синхронизатсия аз бастаи ҳамзамон мебошад , ки мубодилаи элементҳоро байни як ҷуфт риштаҳо тавассути эҷоди як нуқтаи ҳамоҳангсозии умумӣ осон мекунад. Истифодаи он мубодилаи маълумотро байни ду ришта осон мекунад. Тарзи кори он хеле содда аст: он интизор мешавад, ки ду риштаи алоҳида ба усули exchange() занг зананд . Дар байни онҳо чизе монанди нуқтаи мубодила ба вуҷуд меояд: риштаи аввал предмети худро мегузорад ва дар иваз предмети дигареро мегирад ва дуюмӣ бошад, дар навбати худ предмети якумро гирифта, риштаи худро мегузорад. Яъне, риштаи аввал усули exchange()- ро истифода мебарад ва то он даме, ки риштаи дигар усули exchange()- ро дар ҳамон an object даъват кунад ва маълумот байни онҳо мубодила шавад, бекор мемонад. Ҳамчун мисол, татбиқи зерини синфи Thread -ро баррасӣ кунед :
public class CustomThread extends Thread {
 private String threadName;
 private String message;
 private Exchanger<String> exchanger;

 public CustomThread(String threadName, Exchanger<String> exchanger) {
   this.threadName = threadName;
   this.exchanger = exchanger;
 }

 public void setMessage(final String message) {
   this.message = message;
 }

 @Override
 public void run() {
   while (true) {
     try {
       message = exchanger.exchange(message);
       System.out.println(threadName + " поток получил сообщение: " + message);
       Thread.sleep(1000);
     } catch (Exception e) {
       e.printStackTrace();
     }
   }
 }
}
Дар созандаи ришта, мо an objectи Exchanger -ро муайян мекунем , ки an objectҳои навъи String -ро қабул мекунад ва ҳангоми оғозёбӣ (дар усули иҷро ) мо exchange()- и онро барои мубодилаи паём бо риштаи дигаре, ки ин усулро дар ҳамон Exchanger истифода мебарад, истифода мебарем . Биёед онро дар асосӣ иҷро кунем :
Exchanger<String> exchanger = new Exchanger<>();
CustomThread first = new CustomThread("Первый ", exchanger);
first.setMessage("Сообщение первого потока");
CustomThread second = new CustomThread("Второй", exchanger);
second.setMessage("Сообщение второго потока");
first.start();
second.start();
Консол нишон медиҳад:
Риштаи якум хабар гирифт: Паёми риштаи дуюм Риштаи дуюм паём гирифт: Паёми риштаи якум Риштаи дуюм паём гирифт: Паёми риштаи дуюм Риштаи якум паём гирифт: Паёми риштаи якум. ришта паём гирифт: Паёми риштаи якум Риштаи якум паём гирифт: Паёми риштаи дуюм... .
Ин маънои онро дорад, ки мубодилаи маълумот байни риштаҳо муваффақ аст.

112. Фарқи байни синфи Thread ва интерфейси Runnable чист?

Аввалин чизе, ки ман қайд мекунам, ин аст , ки Thread синф аст, Runnable интерфейс аст, ки ин фарқияти хеле возеҳ аст =D Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 13-3Ман инчунин мегӯям, ки Thread Runnable (композиция) -ро истифода мебарад . Яъне мо ду роҳ дорем:
  1. Аз Thread мерос гиред , усули иҷроро бекор кунед, пас ин an objectро эҷод кунед ва риштаро тавассути усули start() оғоз кунед .

  2. Runnable-ро дар як синфи муайян амалӣ кунед , усули run() -и онро татбиқ кунед ва сипас an objectи Thread эҷод кунед , ки ин амалисозии an objectи интерфейси Runnable -ро ба созандаи он таъин мекунад . Хуб, дар охир an objectи Thread -ро бо истифода аз усули start() оғоз кунед .

Кадом афзалтар аст? Биёед каме фикр кунем:
  • Вақте ки шумо интерфейси Runnable -ро татбиқ мекунед , шумо рафтори риштаро тағир намедиҳед. Аслан шумо танҳо ба ришта чизе медиҳед, ки иҷро шавад. Ва ин таркиби мост, ки дар навбати худ муносибати хуб ҳисобида мешавад.

  • татбиқи Runnable ба синфи шумо чандирии бештар медиҳад. Агар шумо аз Thread мерос гиред , амале, ки шумо иҷро мекунед, ҳамеша дар ришта хоҳад буд. Аммо агар шумо Runnable -ро татбиқ кунед , он набояд танҳо як ришта бошад. Дар ниҳоят, шумо метавонед онро дар як ришта иҷро кунед ё ба ягон хидмати иҷрокунанда интиқол диҳед. Хуб, ё танҳо онро ҳамчун вазифа дар як замимаи як ришта гузаронед.

  • Истифодаи Runnable ба шумо имкон медиҳад, ки иҷрои вазифаро аз мантиқи назорати ришта мантиқӣ ҷудо кунед.

  • Дар Java, танҳо як мерос имконпазир аст, бинобар ин танҳо як синфро васеъ кардан мумкин аст. Дар айни замон, шумораи интерфейсҳои васеъшаванда номаҳдуд аст (хуб, на он қадар номаҳдуд, балки 65535 , аммо шумо гумон аст, ки ҳеҷ гоҳ ба ин маҳдудият расед).

Хуб, шумо қарор медиҳед, ки кадомашро истифода бурдан афзалтар аст ^^

113. Наххои Т1, Т2 ва Т3 мавчуданд. Чӣ тавр онҳоро пай дар пай амалӣ кардан мумкин аст?Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 13-4

Аввалин ва соддатарин чизе, ки ба хотир меояд, истифодаи усули join() мебошад . Он иҷрои риштаи ҷориро (ки метод номида мешавад) бозмедорад, то он даме, ки риштае, ки дар он метод ном дошт, иҷро ба охир мерасад. Биёед амалисозии риштаи худро эҷод кунем:
public class CustomThread extends Thread {
private String threadName;

 public CustomThread(final String  threadName){
   this.threadName = threadName;
 }

 @Override
 public void run() {
   System.out.println(threadName + " - начал свою работу");
   try {
     // происходит некая логика
     Thread.sleep(1000);
   } catch (InterruptedException e) {
     e.printStackTrace();
   }

   System.out.println(threadName + " - закончил свою работу");
 }
}
Биёед се чунин риштаро як ба як бо истифода аз join() оғоз кунем :
CustomThread t1 = new CustomThread("Первый поток");
t1.start();
t1.join();
CustomThread t2 = new CustomThread("Второй поток");
t2.start();
t2.join();
CustomThread t3 = new CustomThread("Третий поток");
t3.start();
t3.join();
Натиҷаи консол:
Нахи якум — ба кор шуруъ кард Рихти якум — кори худро ба охир расонд Рихти дуюм — ба кор шуруъ кард Рихти дуюм — кори худро ба охир расонд Рихти сеюм — ба кор шуруъ кард Рихти сеюм — кори худро ба охир расонд.
Ин чунин маъно дорад, ки мо вазифаи худро ичро кардем. Баъдан, мо бевосита ба вазифаҳои амалӣ дар сатҳи Junior мегузарем .

Вазифаҳои амалӣ

114. Матритсаи Маблағи диагоналӣ (масъалаи Leetcode)

Шарт: Ҷамъи ҳамаи элементҳои диагонали асосӣ ва ҳамаи элементҳои диагонали иловагӣ, ки ҷузъи диагонали асосӣ нестанд, ҳисоб кунед. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 13 — 51. Бо матритсаи шакл: mat = [[1,2,3], [4,5,6], [7,8,9]] Натиҷа бояд - 25 бошад 2. Бо матритса - mat = [[1,1 ,1,1], [1,1,1,1], [1,1,1,1], [1,1,1,1]] Натиҷа бояд бошад - 8 3. Бо a matrix - mat = [[ 5]] Хулоса бояд бошад - 5 Хонданро таваққуф кунед ва қарори худро амалӣ кунед. Ҳалли ман чунин хоҳад буд:
public static int countDiagonalSum(int[][] matrix) {
 int sum = 0;
 for (int i = 0, j = matrix.length - 1; i < matrix.length; i++, j--) {
   sum += matrix[i][i];
   if (j != i) {
     sum += matrix[i][j];
   }
 }
 return sum;
}
Ҳама чиз бо як гузариш аз массив рӯй медиҳад, ки дар давоми он мо ду индекс барои гузориш дорем: i - барои гузориш додани сатрҳои массив ва сутунҳои диагонали асосӣ, j - барои гузориш додани сутунҳои диагонали иловагӣ. Агар ячейкаи диагонали асосӣ ва изофӣ мувофиқат кунанд, пас яке аз арзишҳо ҳангоми ҳисоб кардани маблағ сарфи назар карда мешаванд. Биёед бо истифода аз матритсаҳо аз шарти зерин тафтиш кунем:
int[][] arr1 = {
   {1, 2, 3},
   {4, 5, 6},
   {7, 8, 9}};
System.out.println(countDiagonalSum(arr1));

int[][] arr2 = {
   {1, 1, 1, 1},
   {1, 1, 1, 1},
   {1, 1, 1, 1},
   {1, 1, 1, 1}};
System.out.println(countDiagonalSum(arr2));

int[][] arr3 = {{5}};
System.out.println(countDiagonalSum(arr3));
Натиҷаи консол:
25 8 5

115. Ҳаракати сифрҳо (Leetcode мушкилоти)

Ҳолат: Дар массиви бутун, ҳама 0-ро ба охир гузоред ва тартиби нисбии элементҳои ғайрисифрро нигоҳ доред. 1. Бо массив: [0,1,0,3,12] Натиҷа бояд чунин бошад: [1,3,12,0,0] 2. Бо массив: [0] Натиҷа бояд бошад: [0] Таваққуф кунед ва қарори маро нависед... Қарори ман:
public static void moveZeroes(int[] nums) {
 int counterWithoutNulls = 0;
 int counterWithNulls = 0;
 int length = nums.length;
 while (counterWithNulls < length) {
   if (nums[counterWithNulls] == 0) {// находим нулевые элементы и увеличиваем счётчик
     counterWithNulls++;
   } else { // сдвигаем элементы на количество найденных нулевых элементов слева
     nums[counterWithoutNulls++] = nums[counterWithNulls++];
   }
 }
 while (counterWithoutNulls < length) {
   nums[counterWithoutNulls++] = 0;// заполняем последние элементы массива нулями согласно счётчику нулей
 }
}
Имтиҳон:
int[] arr1 = {1, 2, 0, 0, 12, 9};
moveZeroes(arr1);
System.out.println(Arrays.toString(arr1));

int[] arr2 = {0};
moveZeroes(arr2);
System.out.println(Arrays.toString(arr2));
Натиҷаи консол:
[1, 2, 12, 9, 0, 0] [0]

116. Рӯйхати номҳои <String> додашуда. Ҳарфи аввалро аз ҳар як ном хориҷ кунед ва рӯйхати мураттабшударо гардиш кунед

1. Аввалин чизе, ки ба хотир меояд, усулҳои синфи Collections мебошад , ки усулҳои зиёди ёрирасон барои коллексияҳоро дар бар мегирад:
public static List<String> processTheList(List<String> nameList) {
 for (int i = 0; i < nameList.size(); i++) {
   nameList.set(i, nameList.get(i).substring(1));
 }
 Collections.sort(nameList);
 return nameList;
}
2. Инчунин, агар мо versionи 8 ва навтари Java-ро истифода барем, мо бояд танҳо ҳалли худро тавассути ҷараёнҳо нишон диҳем:
public static List<String> processTheList(List<String> nameList) {
 return nameList.stream()
     .map(x -> x.substring(1))
     .sorted().collect(Collectors.toList());
}
Новобаста аз ҳалли интихобшуда, чек метавонад чунин бошад:
List<String> nameList = new ArrayList();
nameList.add("John");
nameList.add("Bob");
nameList.add("Anna");
nameList.add("Dmitriy");
nameList.add("Peter");
nameList.add("David");
nameList.add("Igor");

System.out.println(processTheList(nameList));
Натиҷаи консол:
[авид, этер, гор, митрий, нна, об, оҳ]

117. Массивро гардонед

Ҳалли 1 Боз, аввалин чизе, ки ба хотир меояд, истифодаи усулҳои синфи ёрирасони Collections мебошад . Аммо азбаски мо массив дорем, аввал бояд онро ба коллексия (рӯйхат) табдил диҳем:
public static Integer[] reverse(Integer[] arr) {
 List<Integer> list = Arrays.asList(arr);
 Collections.reverse(list);
 return list.toArray(arr);
}
Ҳалли 2 Азбаски савол дар бораи массив буд, ман фикр мекунам, ки ҳалли онро бидуни истифодаи функсионалии тайёр аз қуттӣ нишон додан лозим аст ва ба гуфтаи классикон:
public static Integer[] reverse(Integer[] arr) {
 for (int i = 0; i < arr.length / 2; i++) {
   int temp = arr[i];
   arr[i] = arr[arr.length - 1 - i];
   arr[arr.length - 1 - i] = temp;
 }
 return arr;
}
Имтиҳон:
Integer[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(Arrays.toString(reverse(arr)));
Натиҷаи консол:
[9, 8, 7, 6, 5, 4, 3, 2, 1]

118. Санҷед, ки оё сатр палиндром аст

Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 13-6Ҳалли 1 Дарҳол ба ёд овардани StringBuilder лозим аст : он дар муқоиса бо String муқаррарӣ чандиртар ва аз усулҳои гуногун бой аст . Мо махсусан ба усули баръакс таваҷҷӯҳ дорем :
public static boolean isPalindrome(String string) {
 string = string.toLowerCase(); //приводит всю строку к нижнему регистру
 StringBuilder builder = new StringBuilder();
 builder.append(string);
 builder.reverse(); // перевочиваем строку методом Builder-а
 return (builder.toString()).equals(string);
}
Ҳалли: Муносибати навбатӣ бидуни истифодаи "ҷойҳо" аз қуттӣ хоҳад буд. Мо аломатҳои қафои сатрро бо аломатҳои мувофиқи пеш муқоиса мекунем:
public static boolean isPalindrome(String string) {
  string = string.toLowerCase();
 int length = string.length();
 int fromBeginning = 0;
 int fromEnd = length - 1;
 while (fromEnd > fromBeginning) {
   char forwardChar = string.charAt(fromBeginning++);
   char backwardChar = string.charAt(fromEnd--);
   if (forwardChar != backwardChar)
     return false;
 }
 return true;
}
Ва мо ҳарду равишро тафтиш мекунем:
boolean isPalindrome = isPalindrome("Tenet");
System.out.println(isPalindrome);
Натиҷаи консол:
дуруст

119. Алгоритми оддии навъбандиро нависед (Bubble, Selection ё Shuttle). Чӣ тавр онро беҳтар кардан мумкин аст?

Ҳамчун алгоритми оддӣ барои татбиқ, ман мураттабсозии интихобро интихоб кардам - ​​Интихоби Интихоб:
public static void selectionSorting(int[] arr) {
 for (int i = 0; i < arr.length - 1; i++) {
   int min = i;
   for (int j = i + 1; j < arr.length; j++) {
     if (arr[j] < arr[min]) {
       min = j; // выбираем минимальный элемент в текущем числовом отрезке
     }
   }
   int temp = arr[min]; // меняем местами минимальный элемент с элементом под индексом i
   arr[min] = arr[i]; // так How отрезок постоянно уменьшается
   arr[i] = temp; // и выпадающие из него числа будут минимальными в текущем отрезке
 } // и How итог - числа оставшиеся вне текущей итерации отсортированы от самого наименьшего к большему
}
Версияи такмилёфта чунин хоҳад буд:
public static void improvedSelectionSorting(int[] arr) {
 for (int i = 0, j = arr.length - 1; i < j; i++, j--) { // рассматриваемый отрезок с каждой итерацией
   // будет уменьшаться с ДВУХ сторон по одному элементу
   int min = arr[i];
   int max = arr[i];
   int minIndex = i;
   int maxIndex = i;
   for (int n = i; n <= j; n++) { // выбираем min и max на текущем отрезке
     if (arr[n] > max) {
       max = arr[n];
       maxIndex = n;
     } else if (arr[n] < min) {
       min = arr[n];
       minIndex = n;
     }
   }
   // меняем найденный минимальный элемент с позиции с индексом min на позицию с индексом i
   swap(arr, i, minIndex);

   if (arr[minIndex] == max) {// срабатывает, если элемент max оказался смещен предыдущей перестановкой -
     swap(arr, j, minIndex); // на старое место min, поэтому с позиции с индексом min смещаем его на позицию j
   } else {
     swap(arr, j, maxIndex); // простое обмен местами элементов с индексами max и j
   }
 }
}

static int[] swap(int[] arr, int i, int j) {
 int temp = arr[i];
 arr[i] = arr[j];
 arr[j] = temp;
 return arr;
}
Хуб, ҳоло мо бояд боварӣ ҳосил кунем, ки оё ҷудокунӣ воқеан беҳтар шудааст. Биёед иҷрои онро муқоиса кунем:
long firstDifference = 0;
long secondDifference = 0;
long primaryTime;
int countOfApplying = 10000;
for (int i = 0; i < countOfApplying; i++) {
 int[] arr1 = {234, 33, 123, 4, 5342, 76, 3, 65,
     3, 5, 35, 75, 255, 4, 46, 48, 4658, 44, 22,
     678, 324, 66, 151, 268, 433, 76, 372, 45, 13,
     9484, 499959, 567, 774, 473, 3, 32, 865, 67, 43,
     63, 332, 24, 1};
 primaryTime = System.nanoTime();
 selectionSorting(arr1);
 firstDifference += System.nanoTime() - primaryTime;

 int[] arr2 = {234, 33, 123, 4, 5342, 76, 3, 65,
     3, 5, 35, 75, 255, 4, 46, 48, 4658, 44, 22,
     678, 324, 66, 151, 268, 433, 76, 372, 45, 13,
     9484, 499959, 567, 774, 473, 3, 32, 865, 67, 43,
     63, 332, 24, 1};
 primaryTime = System.nanoTime();
 improvedSelectionSorting(arr2);
 secondDifference += System.nanoTime() - primaryTime;
}

System.out.println(((double) firstDifference / (double) secondDifference - 1) * 100 + "%");
Ҳарду навъ дар як давра оғоз шуданд, зеро агар ҳалқаҳои алоҳида вуҷуд дошта бошанд, аз рӯи codeи боло ҷудокунӣ натиҷаи бадтарро нишон медод, назар ба он ки он дуюм гузошта шуда бошад. Ин аз он сабаб аст, ки барнома "гарм мешавад" ва баъд каме тезтар кор мекунад. Аммо ман каме аз мавзӯъ берун меравам. Пас аз панҷ давиши ин чек дар консол, ман афзоиши иҷроишро дидам: 36.41006735635892% 51.46131097160771% 41.88918834013988% 48.09198070574370612 , Ин барои ман аст3370612. натичаи хеле хуб. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 13 — 7

120. Алгоритм (пайдарпаии амалњо)-ро барои сохтани литерали типи int бо адабии типи byte нависед. Фаҳмонед, ки бо хотира чӣ рӯй медиҳад

  1. арзиши byte ба int табдил дода мешавад. Барои он на 1 byte хотира ҷудо карда мешавад, балки мисли ҳамаи арзишҳои int - 4, агар ин арзиш ҳанӯз дар стеки int набошад. Агар мавҷуд бошад, истинод ба он танҳо гирифта мешавад.

  2. Ду арзиши int илова карда мешавад ва сеюм ба даст меояд. Барои он бахши нави хотира ҷудо карда мешавад - 4 byte (ё аз стеки int ба арзиши мавҷуда маълумотнома гирифта мешавад).

    Дар ин ҳолат, хотираи ду инт ҳамчунон ишғол карда мешавад ва арзишҳои онҳо мутаносибан дар стек int нигоҳ дошта мешаванд.

Воқеан, дар ин ҷо саволҳои сатҳи наврасон аз рӯйхати мо ба охир мерасанд. Аз мақолаи навбатӣ мо масъалаҳои сатҳи миёнаро мефаҳмем. Ман мехоҳам қайд намоям, ки саволҳои сатҳи миёна низ ба таҳиягарони сатҳи ибтидоӣ - Junior фаъолона дода мешаванд. Пас, бохабар монед. Хуб, ин ҳама барои имрӯз аст: вохӯред!Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 13 — 8
Дигар маводҳо дар силсила:
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION