JavaRush /Java Blog /Random-TK /Java dörediji üçin geçirilen söhbetdeşliklerden soraglary...

Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi. 13-nji bölüm

Toparda çap edildi
Salam!
Bir maksada tarap hereket, ilkinji nobatda hereketdir.
Şonuň üçin diňe bir zada ýetmek isleýärsiňiz diýip pikir etmek ýeterlik däl. Bir zat etmeli - hatda iň kiçi ädimlerem - ýöne olary her gün ýerine ýetiriň we diňe şu ýol bilen iň soňky maksadyňyza ýetersiňiz. Java döredijiler bolmak üçin şu ýere geleniňiz üçin, her gün Java hakda bilimleriňizi çuňlaşdyrmak üçin iň azyndan bir ädim ätmeli. Şu günki Java ädimi üçin, döredijiler üçin iň meşhur söhbetdeşlik soraglarynyň derňewiniň täze bölümi bilen tanyşmagyňyzy maslahat berýärin. Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  13-nji bölümBu gün kiçi hünärmenler üçin soraglaryň amaly bölümini öwreneris. Söhbetdeşlikde amaly mesele seýrek däl. Şeýle ýagdaýa düşmezlik, salkyn kelläni saklamaga synanyşmak we iň amatly çözgüdi, hatda birnäçe teklip hödürlemek möhümdir. Şeýle hem, bir mesele çözülende dymmazlygy maslahat bererin, ýöne pikirlenýän we çözgüt ýazýan otlyňyza teswir ýazyň ýa-da ýazanyňyzdan soň näme edeniňizi we sebäbini söz bilen düşündiriň. Bu sizi söhbetdeşlige sessiz karar bermekden has gowy görer. Geliň, başlalyň!

111. Saplaryň arasynda maglumatlary nädip alyşmaly?

Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  13-nji bölümSaplaryň arasynda maglumat alyşmak üçin köp dürli çemeleşmeleri we serişdeleri ulanyp bilersiňiz: mysal üçin atom üýtgeýjilerini, sinhron kolleksiýalary we semafor. Emma bu meseläni çözmek üçin Exchanger bilen mysal bererin . Exchanger , umumy sinhronizasiýa nokadyny döretmek arkaly jübüt sapaklaryň arasynda elementleriň alyş-çalşyny aňsatlaşdyrýan paketden sinhronizasiýa synpydyr . Ulanylyşy iki sapagyň arasynda maglumat alyş-çalşyny aňsatlaşdyrýar. Işleýiş usuly gaty ýönekeý: alyş-çalyş () usuly diýip iki aýry sapaga garaşýar . Olaryň arasynda alyş-çalyş nokady ýaly bir zat döredilýär: birinji sapak obýektini goýýar we beýlekisiniň obýektini alýar, ikinjisi bolsa öz gezeginde birinjiniň obýektini alýar we özüne degişlidir. .Agny, birinji sapak alyş-çalyş () usulyny ulanýar we başga bir sapak şol bir obýektdäki alyş-çalyş () usulyny çagyrýança we olaryň arasynda maglumat alyşýança işsiz bolýar . Mysal hökmünde, sapak synpynyň aşakdaky ýerine ýetirilişine serediň :
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();
     }
   }
 }
}
Ip konstruktorynda, String görnüşindäki obýektleri kabul edýän Exchanger obýektini kesgitleýäris we işe başlanda (işleýiş usulynda ) şol alyş - çalyşda bu usuly ulanýan başga bir sapak bilen habar alyşmak üçin onuň alyş-çalşygyny ulanýarys . Esasy ýagdaýda işledeliň :
Exchanger<String> exchanger = new Exchanger<>();
CustomThread first = new CustomThread("Первый ", exchanger);
first.setMessage("Сообщение первого потока");
CustomThread second = new CustomThread("Второй", exchanger);
second.setMessage("Сообщение второго потока");
first.start();
second.start();
Konsol görkeziler:
Birinji sapak habary aldy: Ikinji sapakdan habar Ikinji sapakdan habar geldi: Birinji sapakdan habar Ikinji sapakdan habar geldi: Ikinji sapakdan habar Birinji sapakdan habar geldi: Birinji sapakdan habar Ikinji sapak sapak habary aldy: Birinji sapakdan habar Birinji sapakdan habar geldi: Ikinji sapakdan habar ....
Bu, sapaklaryň arasynda maglumat alyş-çalşygynyň üstünlikli bolandygyny aňladýar.

112. “Thread” synpy bilen “Runnable” interfeýsiniň arasynda näme tapawut bar?

Ilki bilen belläp geçjek zadym, “Thread” synpdyr, “ Runnable” interfeýsdir, bu gaty açyk tapawut = D Şeýle hem, “Runnable (kompozisiýa) ulanýandygyny Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  13-nji bölümaýdaryn . .Agny, biziň iki ýolumyz bar:
  1. Sapakdan miras alyň , iş usulyny ýok ediň, soňra bu obýekti dörediň we sapagy başlangyç () usuly bilen başlaň .

  2. “Runnable” -ni belli bir synpda ýerine ýetiriň , onuň run () usulyny ýerine ýetiriň we “ Runnable” interfeýsiniň bu obýektini ýerine ýetirijisine belläp, “ Thread” obýektini dörediň . Ahyrynda, başlangyç () usuly bilen mowzuk obýektini işe giriziň .

Iň gowusy näme? Biraz pikirleneliň:
  • “Runnable ” interfeýsini durmuşa geçireniňizde , sapagyň özüni alyp barşyny üýtgetmersiňiz. Aslynda, sapagy işletmek üçin diňe bir zat berýärsiňiz. Bu bolsa öz gezegimizde gowy çemeleşme hasaplanýar.

  • “Runnable” -y durmuşa geçirmek synpyňyza has çeýeligi berýär. Eger mowzukdan miras alsaňyz , ýerine ýetirýän işiňiz hemişe sapakda bolar. Runöne “Runnable” -y durmuşa geçirseň, diňe bir sapak bolmaly däl. Galyberse-de, ony sapakda işledip ýa-da käbir ýerine ýetiriji hyzmatyna geçirip bilersiňiz. Bolýar, ýa-da diňe bir sapakly programmada mesele hökmünde bir ýere geçiriň.

  • “Runnable” -y ulanmak, meseläni ýerine ýetiriş sapaklaryny logika bilen logiki taýdan aýyrmaga mümkinçilik berýär.

  • Java-da diňe ýekeje miras bolup biler, şonuň üçin diňe bir synpy uzaldyp bolar. Şol bir wagtyň özünde, giňeldilip bilinýän interfeýsleriň sany çäksizdir (gowy, gaty çäklendirilmedik, ýöne 65535 , ýöne bu çäkden çykmak ähtimallygyňyz ýok).

Dogrusy, ^^ ulanmagyň has gowudygyny kesgitlemek size bagly

113. T1, T2 we T3 sapaklary bar. Olary yzygiderli nädip durmuşa geçirmeli?Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  13 - 4 bölüm

Kellä gelen ilkinji we iň ýönekeý zat, goşulmak () usulyny ulanmakdyr . Häzirki sapagyň (usul diýilýär) ýerine ýetirilmegini togtadýança ýerine ýetirilýär. Geliň, öz sapaklarymyzy durmuşa geçireliň:
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 + " - закончил свою работу");
 }
}
Goşulmak () ulanyp, şeýle sapaklary birin-birin başlalyň :
CustomThread t1 = new CustomThread("Первый поток");
t1.start();
t1.join();
CustomThread t2 = new CustomThread("Второй поток");
t2.start();
t2.join();
CustomThread t3 = new CustomThread("Третий поток");
t3.start();
t3.join();
Konsol çykyşy:
Birinji sapak - işine başlady Birinji sapak - işini tamamlady Ikinji sapak - işine başlady Ikinji sapak - işini tamamlady Üçünji sapak - işine başlady Üçünji sapak - işini tamamlady
Bu biziň wezipämizi ýerine ýetirendigimizi aňladýar. Soň bolsa, gönüden-göni ýetginjekler derejesinde amaly meselelere geçýäris .

Amaly meseleler

114. Matrisa diagonaly jem (Leetkod meselesi)

: Agdaýy: Esasy diagonalyndaky ähli elementleriň jemini we esasy diagonalyň bölegi bolmadyk goşmaça diagonaly elementleriň jemi hasaplaň. Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  13-5-nji bölüm1. Formanyň matrisasy bilen: mat = [[1,2,3], [4,5,6], [7,8,9]] Çykyş - 25 2. Matrisa bilen - mat = [[1,1, 1,1], [1,1,1,1], [1,1,1,1], [1,1,1,1]] Çykyş - 8 3. bolmaly matrisa - mat = [[5]] Netije bolmaly - 5 Okamagy duruzyň we kararyňyzy ýerine ýetiriň. Meniň çözgütim aşakdakylar bolar:
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;
}
Hemme zat massiwden bir geçiş bilen bolup geçýär, şol döwürde hasabat üçin iki indeksimiz bar: i - esasy diagonalyň sütünlerini we sütünlerini habar bermek üçin, j - goşmaça diagonalyň sütünlerini habar bermek üçin. Esasy diagonaly we goşmaça öýjük gabat gelýän bolsa, jem hasaplanylanda bahalaryň biri hasaba alynmaýar. Theagdaýdan matrisalary ulanyp barlalyň:
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));
Konsol çykyşy:
25 8 5

115. Nollary süýşüriň (Leetcode kynçylygy)

: Agdaýy: Bitewi massiwde, nol däl elementleriň otnositel tertibini saklap, 0-yň hemmesini ahyryna geçiriň. 1. Bir massiw bilen: [0,1,0,3,12] Çykyş: [1,3,12,0,0] 2. Bir massiw bilen: [0] Çykyş: [0] Arakesmäň we kararymy ýazyň ... Kararym:
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;// заполняем последние элементы массива нулями согласно счётчику нулей
 }
}
Synag:
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));
Konsol çykyşy:
[1, 2, 12, 9, 0, 0] [0]

116. Berlen sanaw <String> atlary. Her atdan birinji harpy aýyryň we tertiplenen sanawy aýlaň

1. Ilki bilen kellä gelen zat , kolleksiýalar üçin köp kömekçi usullary öz içine alýan Kolleksiýalar synpynyň usullary:
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. Şeýle hem, Java wersiýasy 8 we has ýokary ulansak, çözgüdi diňe akymlar arkaly görkezmeli:
public static List<String> processTheList(List<String> nameList) {
 return nameList.stream()
     .map(x -> x.substring(1))
     .sorted().collect(Collectors.toList());
}
Saýlanan çözgüdiň haýsydygyna garamazdan, çek aşakdaky ýaly bolup biler:
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));
Konsol çykyşy:
[höwesli, eter, gor, mitriý, nna, ob, ohn]

117. Tertibi aýlaň

Çözgüt 1 Againene-de kellä gelen ilkinji zat, kömekçi peýdaly synp kolleksiýalarynyň usullaryny ulanmak . Aöne bir massiwimiz bolansoň, ilki bilen ony kolleksiýa (sanaw) öwürmeli:
public static Integer[] reverse(Integer[] arr) {
 List<Integer> list = Arrays.asList(arr);
 Collections.reverse(list);
 return list.toArray(arr);
}
Çözgüt 2 Sorag bir massiw bilen baglanyşyklydygy sebäpli, çözgüdi gutujykdan taýýar funksiýany ulanmazdan görkezmeli we klassiklere görä:
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;
}
Synag:
Integer[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(Arrays.toString(reverse(arr)));
Konsol çykyşy:
[9, 8, 7, 6, 5, 4, 3, 2, 1]

118. Setiriň palindromdygyny ýa-da ýokdugyny barlaň

Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  13-6-njy bölümÇözgüt 1 StringBuilder-i derrew ýatda saklamaly : adaty String bilen deňeşdirilende has çeýe we dürli usullara baý . Aýratynam ters usul bilen gyzyklanýarys :
public static boolean isPalindrome(String string) {
 string = string.toLowerCase(); //приводит всю строку к нижнему регистру
 StringBuilder builder = new StringBuilder();
 builder.append(string);
 builder.reverse(); // перевочиваем строку методом Builder-а
 return (builder.toString()).equals(string);
}
Çözgüt: Indiki çemeleşme gutulardan “boşluklary” ulanmazdan bolar. Setiriň arka tarapyndaky nyşanlary öňdäki degişli nyşanlar bilen deňeşdirýäris:
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;
}
Iki çemeleşmäni hem barlaýarys:
boolean isPalindrome = isPalindrome("Tenet");
System.out.println(isPalindrome);
Konsol çykyşy:
dogry

119. simpleönekeý sortlaşdyryş algoritmini ýazyň (Bubble, Selection ýa-da Shuttle). Nädip gowulaşdyryp bolar?

Durmuşa geçirmek üçin ýönekeý algoritm hökmünde saýlamany tertipleşdirmegi saýladym - Saýlama tertibi:
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 итог - числа оставшиеся вне текущей итерации отсортированы от самого наименьшего к большему
}
Kämilleşdirilen wersiýa şeýle bolar:
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;
}
Bolýar, indi sortlamagyň hakykatdanam gowulaşandygyna göz ýetirmeli. Netijäni deňeşdireliň:
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 + "%");
Iki görnüşi hem bir siklde başlandy, sebäbi aýratyn aýlawlar bar bolsa, ýokardaky koddan tertiplemek, ikinji ýerde goýulandan has erbet netijeleri görkezerdi. Munuň sebäbi programmanyň “gyzýar” we soň biraz çalt işleýär. Topicöne mowzukdan azajyk gidýärin. Konsolda bu barlagdan bäş gezek geçensoň, öndürijiligiň ýokarlanandygyny gördüm: 36.41006735635892% 51.46131097160771% 41.88918834013988% 48.091980705743566% 37.120220461591444% Meniň pikirimçe, bu gaty gowy netije. Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  13-7-nji bölüm

120. Göçme manyda int görnüşini göni baýt bilen düzmek üçin algoritm (hereketleriň yzygiderliligi) ýazyň. Memoryat bilen näme bolýandygyny düşündiriň

  1. baýt bahasy int-e öwrülýär. Munuň üçin 1 baýt ýat bölünip berilmez, ýöne ähli int bahalary ýaly - 4, bu baha entek int stackde bolmasa. Eger bar bolsa, oňa baglanyşyk diňe kabul ediler.

  2. Iki int bahasy goşular we üçünjisi alynar. Munuň üçin täze ýat bölümi bölüner - 4 baýt (ýa-da int stackden bar bolan gymmata salgylanma alynar).

    Bu ýagdaýda iki intsiň ýady henizem saklanar we olaryň bahalary degişlilikde int stakasynda saklanar.

Aslynda, sanawymyzdaky Junior derejeli soraglar şu ýerde gutarýar. Indiki makaladan başlap, orta derejeli meselelere düşüneris. Orta derejeli soraglaryň giriş derejesindäki işläp düzüjilerden - Junior-den işjeň soralýandygyny belläsim gelýär. Şonuň üçin habarly boluň. Dogrusy, bu gün üçin hemmesi: görüşeris!Java dörediji üçin geçirilen söhbetdeşliklerden soraglaryň we jogaplaryň derňewi.  13-nji bölüm
Tapgyryň beýleki materiallary:
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION