JavaRush tələbələri üçün proqramlaşdırma problemləri, Java və validator ən yaxşı dostlardır. Bununla belə, hər bir tərtibatçı Padawan üçün elə bir vaxt gəlir ki, o, bəzən yoldan çıxmağa, özü üçün mini layihələr hazırlamağa və müsahibələrə hazırlaşmağa ehtiyac duyur. Müsahibə zamanı elə görünür ki, siz kursda olduğu kimi eyni praktik Java problemləri ilə qarşılaşmalısınız. Əksər hallarda bu doğrudur, lakin bəzi şirkətlər hiyləli suallar və ya qeyri-adi bir şey soruşmağı sevirlər. Stressli müsahibə zamanı çaşqınlıq yaşamamaq üçün bu cür Java problemlərini evdə özünüz həll etməyə çalışmaq faydalıdır.
Bu yazıda biz bu çətin tapşırıqların yarısına baxacağıq. Əvvəlcə şərti oxumağı və onu özünüz həll etməyə çalışmanızı tövsiyə edirik. Və daha bir şey: hər gün kursdan Java problemlərini həll etməyi unutmayın!
- Tapşırıq-1: Sıfırdan sonsuz bir döngə yaratmaq
- Tapşırıq-2. İcra ediləcək bir şərh yaradın
- Tapşırıq-3: Adlandırılmış döngə yaradın
- Tapşırıq-4. Tam ədədlər massivindəki tək dublikat haqqında
- Tapşırıq-5. Tam ədədlər massivində unikal olmayan dublikat haqqında
Java Problemi - 1: Sıfırdan sonsuz bir döngə yaratmaq
Kod bloku verilir. Döngənin sonsuz olması üçün onu tamamlayın.class ToInfinity {
public static void main(String[] args) {
//впишите code сюда
for (int i = start; i <= start + 1; i++) {
/* тут должен быть бесконечный цикл, менять ничего нельзя*/
}
}
}
"Mürəkkəb bir şey yoxdur" deyirsiniz. Çox güman ki, özünüzü bir dəfədən çox bu vəziyyətdə tapmısınız: Java problemlərini həll edərkən sonsuz bir döngə yaratdınız və ondan necə qurtulacağınızı düşündünüz. Əksinə. Hiylə budur ki, dövrün özü və ondan çıxmaq şərtləri dəyişdirilə bilməz. Yalnız iki təkrarlama var. Bununla belə, sonsuz bir döngə yaratmaq üçün kifayət qədər bunlar var. Deyəsən, o, yalnız iki iterasiya üçün işləməlidir, lakin daşqından istifadə etməklə onu sonsuz etmək olar. Artıq necə olduğunu təxmin etmisiniz?
Həll
Daşma səbəbiylə. Java-da saxlanıla bilənInteger.MAX_VALUE
maksimum dəyərdir . int
Bu dəyərə çatsanız və artırsanız, -a , yəni minimum dəyərə Integer.MAX_VALUE
yuvarlanırsınız . Beləliklə, bu Java problemini həll etmək üçün sadəcə dəyişənə məlumat növü üçün maksimum dəyərdən 1 az olan bir dəyər təyin etməliyik . Java-da tapşırıq kodu:Integer.MIN_VALUE
Integer
start
int
class ToInfinity {
public static void main(String[] args) {
int start = Integer.MAX_VALUE - 1;
for (int i = start; i <= start + 1; i++) {
//бесконечный цикл
System.out.println(i); //убеждаемся в бесконечности цикла
}
}
}
Nə baş verir? start=2147483645 (Integer.MAX_VALUE-1) ilə başlayırıq, növbəti iterasiyada dəyər 2147483645, sonra 2147483646, sonra -2147483648, -2147483647... və s. olur.
Java tapşırığı-2. İcra ediləcək şərh yaradın
Yaxşı, buradayıq! İlk mühazirələrdən eşitdik ki, şərhlər icra olunmur. Buna görə də şərhlərdir. Düşünürük ki, bu problemin həlli Java proqramçısı, hətta təcrübəli biri üçün həmişə aydın olmur. Bununla belə, Java maşınını icra üçün şərhi “qanuni olaraq” işə salmağa məcbur etməyin bir çətin yolu var. Küləyin haradan əsdiyini hiss edirsən? Təxmin etməyə çalışın!Həll
Java-da problemi həll etmək üçün kod:public class ExecutableComment {
public static void main(String[] args) {
// комментарий ниже будет выполнен!
// \u000d System.out.println("выполняемый комментарий");
}
}
Bu tapşırığın kodunu IDE-də Java-da yazsaq, əldə etdiyimiz budur:
выполняемый комментарий
Səbəb Java kompilyatorunun Unicod simvolunu \u000d
yeni sətir kimi oxuması və kodumuzu aşağıdakı kimi oxumasıdır: Kompilyator Java-da problemin həlli üçün kodu deşifrə etdi:
public class ExecutableComment {
public static void main(String[] args) {
// the line below this gives an output
// \u000d
System.out.println("comment executed");
}
}
Java Tapşırığı - 3: Adlandırılmış döngə yaradın
"Praktik proqramlaşdırma problemləri, sferik vakuumda Java" seriyasının başqa bir nümayəndəsi. Bunun nə üçün lazım olduğu aydın olmadığı mənasında, çətin ki, dövrün şəxsiyyətsiz olmasından incidiyini hiss etsin. Yaxşı, tamam, başqa bir şey vacibdir: dil dövrəyə bir ad verməyə imkan verir.Həll
Qeyd: bəziləri üçün bu cür "adlar" praktikada istifadə edilməsi tövsiyə edilməyən "teqlər" kimi tanınır. Java-da problemin həlli üçün kod, adlandırılmış bir döngə nümayiş etdirirpublic class NamedLoop {
public static void main(String[] args) {
loop1:
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i == 3)
break loop1;
System.out.println("i = " + i + " j = " + j);
}
}
}
}
Proqramı işlətsəniz, nəticə belə olacaq:
i = 0 j = 0
i = 0 j = 1
i = 0 j = 2
i = 0 j = 3
i = 0 j = 4
i = 1 j = 0
i = 1 j = 1
i = 1 j = 2
i = 1 j = 3
i = 1 j = 4
i = 2 j = 0
i = 2 j = 1
i = 2 j = 2
i = 2 j = 3
i = 2 j = 4
Burada siz həmçinin adlandırılmış döngənin əvvəlinə getmək üçün davam etməkdən istifadə edə bilərsiniz. Lazım gələrsə, istifadə edərək bir neçə döngəni parçalamaq üçün iç içə - döngədə (və ya ) istifadə break
edə bilərsiniz . Bu, çoxlu bayraqlar təyin etməkdən və daxili döngəyə davam etmək və ya çıxmaq üçün onları sınamaqdan qaçmağa kömək edəcək. continue
if-else
for
if-else
if-else
Java Problemi - 4. Tam ədədlər massivindəki yeganə dublikat haqqında
1-dən 100-ə qədər elementləri olan tam ədədlərdən ibarət massiv (və yaArrayList
istədiyiniz kimi) verilmişdir Integer
. Bu massivdə bir və yalnız bir təkrarlanan element var. Onu necə tapmaq olar? Bu cür tapşırıqlar Java proqramçısına əvvəlki üç tapşırıqdan daha çox tanışdır. Çünki söhbət dilin demək olar ki, istifadə olunmayan incəliklərini bilməkdən yox, məntiqdən gedir. Kobud güclə həll etmək üçün ilk qeyri-ciddi impuls başınız işə düşdükdə və ya "Mən proqramçıyam, mən ağıllıyam" münasibəti olduqda çox tez yox olur. Yeganə pis odur ki, müsahibə zamanı, stress altında, bu baş verməyə bilər. Buna görə həll yoluna baxmazdan əvvəl indi düşünün!
Həll alqoritmi aşağıdakı kimidir:
1-dən 100-ə qədər bütün ədədlərin cəmini hesablayın. Düşünürük ki, siz bunu necə edəcəyinizi bilirsiniz (məsələn, məşhur Qauss metodundan istifadə etməklə).İndi massivinizin elementlərinin cəmini və yaArrayList’а
. Və... birinci məbləği ikincidən çıxarın. Bingo! Nəticədə alınan nömrə dublikat elementin dəyəridir. Java problem həlli kodu ArrayList
.
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class FindDuplicate {
private static void findDuplicate(List<Integer> elements) {
//находим сумму всех уникальных элементов списка
int distinctSum = elements.stream().distinct().mapToInt(e -> e).sum();
//находим сумму всех элементов списка
int totalSum = elements.stream().mapToInt(e -> e).sum();
System.out.println("Элемент, который повторяется : " + (totalSum - distinctSum));
}
public static void main(String[] args) {
//создаем список последовательных элементов на промежутке [1..101).
List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
//устанавливаем элементу с индексом 53 meaning 23
elements.set(53, 23);
findDuplicate(elements);
}
}
Başqa bir həll
import java.util.List;
import java.util.ArrayList;
public class Duplicate {
public int findDuplicateNumber(List<Integer> numbers) {
int highestNumber = numbers.size() - 1;
int total = getSum(numbers);
int duplicate = total - (highestNumber * (highestNumber + 1) / 2);
return duplicate;
}
public int getSum(List<Integer> numbers) {
int sum = 0;
for (int num : numbers) {
sum = sum + num;
}
return sum;
}
public static void main(String a[]) {
List <Integer> numbers = new ArrayList <Integer>();
for (int i = 1; i < 100; i++) {
numbers.add(i);
}
//добавляем дубликат в список
numbers.add(25);
Duplicate dn = new Duplicate();
System.out.println("Элемент, который повторяется: " + dn.findDuplicateNumber(numbers));
}
}
Java Problemi - 5. Tam ədədlər massivində unikal olmayan dublikat haqqında
Əvvəlki problem sizə çox asan görünürdüsə, aşağıdakı problemi həll etməyə çalışın: 1-dən 100-ə qədər tam ədədlər vərəqi verilir. O, dublikatları (birdən çox) ehtiva edir. Bir dəfədən çox baş verən elementləri necə tapmaq olar (elementin özünü tapın və neçə dəfə baş verdiyini göstərin)?Həll
Burada ən məntiqli həll yolu kimi strukturdan istifadə etməkdirHashMap
, çünki o, məlumatları açar-dəyər cütlərində saxlayır. Java problemini həll etmək üçün kod:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class SomeDuplicates {
private static void findDuplicates(List<Integer> elements) {
HashMap <Integer, Integer > duplicates = new HashMap < >();
//заполняем Map duplicates значениями по принципу:
// ключ – meaning element, meaning – сколько раз он встречается
elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
//из duplicates убираем все элементы, которые встретorсь не более 1 раза,
//и сохраняем //результат в список (для удобства обработки на следующем шаге)
List <Map.Entry <Integer, Integer> >
result = duplicates.entrySet().stream().filter(d -> d.getValue() > 1).collect(Collectors.toList());
//выводим результат для всех элементов в списке result
result.forEach(e -> System.out.println(String.format("Элемент %d встречается %d раз", e.getKey(), e.getValue())));
}
public static void main(String[] args) {
List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
elements.set(97, 23);
elements.set(27, 51);
elements.set(99, 23);
findDuplicates(elements);
}
}
GO TO FULL VERSION