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.
Bir hiylə ilə Java problemləri: Salam, müsahibələr!  - 1
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!

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ən Integer.MAX_VALUEmaksimum dəyərdir . intBu dəyərə çatsanız və artırsanız, -a , yəni minimum dəyərə Integer.MAX_VALUEyuvarlanı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_VALUEIntegerstartint
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 \u000dyeni 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ş etdirir
public 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ə breakedə 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. continueif-elseforif-elseif-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ə ya ArrayLististə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ə ya ArrayList’а. 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əkdir HashMap, çü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);
    }
}

Nəticə

Praktiki Java problemləri çox fərqlidir və siz müsahibin sizə hansı naməlum tapmacanı verməyə qərar verəcəyini bilmirsiniz. Bununla belə, hər hansı adekvat işəgötürən başa düşür ki, çətin Java problemlərini həll etmək bacarığından daha vacib olan sizin işiniz zamanı qarşılaşacağınız real praktik problemləri həll etmək bacarığınız olacaq. Beləliklə, onları mümkün qədər çox həll edin. JavaRush buna görə yaradıldı. Bu məqalənin hazırlanmasında geeksforgeeks materiallarından istifadə edilmişdir.