JavaRush /Java blogi /Random-UZ /Hiyla bilan Java muammolari: Salom, intervyular!

Hiyla bilan Java muammolari: Salom, intervyular!

Guruhda nashr etilgan
JavaRush talabalari uchun dasturlash muammolari, Java va validator eng yaxshi do'stdir. Biroq, har bir ishlab chiquvchi Padavan uchun shunday vaqt keladiki, u ba'zida yo'ldan ketishni boshlashi, o'zi uchun mini-loyihalarni ishlab chiqishi va intervyularga tayyorlanishi kerak. Suhbatda siz kursdagi kabi amaliy Java muammolariga duch kelishingiz kerakdek tuyuladi. Aksariyat hollarda bu to'g'ri, lekin ba'zi kompaniyalar hiyla-nayrang yoki g'ayrioddiy narsalarni so'rashni yaxshi ko'radilar. Stressli intervyu paytida chalkashmaslik uchun Java bilan bog'liq bunday muammolarni o'zingiz, uyda hal qilishga harakat qilish foydalidir.
Hiyla bilan Java muammolari: Salom, intervyular!  - 1
Ushbu maqolada biz ushbu qiyin vazifalarning yarim o'ntasini ko'rib chiqamiz. Avval shartni o'qib chiqishingizni va uni o'zingiz hal qilishga harakat qilishingizni tavsiya qilamiz. Va yana bir narsa: har kuni kursdan Java muammolarini hal qilishni unutmang!

Java muammosi - 1: noldan cheksiz tsikl yaratish

Kod bloki berilgan. Loop cheksiz bo'lishi uchun uni to'ldiring.
class ToInfinity {
    public static void main(String[] args) {

//впишите code сюда

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
"Hech narsa murakkab emas", deysiz. Ehtimol, siz bir necha marta bunday vaziyatga duch kelgansiz: Java muammolarini hal qilishda siz cheksiz tsikl yaratdingiz va undan qanday qutulish haqida o'yladingiz. Bu aksincha. Ayyorlik shundaki, tsiklning o'zi va undan chiqish shartlarini o'zgartirib bo'lmaydi. Faqat ikkita takrorlash mavjud. Biroq, cheksiz pastadir yaratish uchun ularning soni etarli. Ko'rinishidan, u faqat ikkita iteratsiya uchun ishlashi kerak, ammo uni to'ldirish orqali cheksiz qilish mumkin. Qanday qilib siz allaqachon taxmin qildingizmi?

Yechim

To'lib ketishi tufayli. Java-da saqlanishi mumkin bo'lgan Integer.MAX_VALUEmaksimal qiymatdir . intAgar siz ushbu qiymatga erishsangiz va oshirsangiz, ga, ya'ni minimal qiymatga Integer.MAX_VALUEo'tasiz . Shunday qilib, ushbu Java muammosini hal qilish uchun biz o'zgaruvchiga ma'lumotlar turi uchun maksimal qiymatdan 1 ga kichik qiymat belgilashimiz kerak . Java-dagi vazifa kodi: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); //убеждаемся в бесконечности цикла
        }
    }
}
Nima bo'ladi? Biz start=2147483645 (Integer.MAX_VALUE-1) bilan boshlaymiz, keyingi iteratsiyada qiymat 2147483645, keyin 2147483646, keyin -2147483648, -2147483647... va hokazo bo'ladi.

Java topshirig'i-2.Bajariladigan izoh yarating

Xo'sh, biz shu yerdamiz! Birinchi ma'ruzalardanoq biz sharhlar bajarilmasligini eshitdik. Shuning uchun ular sharhlardir. Bizning fikrimizcha, bu muammoni hal qilish har doim ham Java dasturchisi, hatto tajribali uchun ham aniq emas. Biroq, Java mashinasini sharhni bajarish uchun "qonuniy" ishga tushirishga majburlashning bitta qiyin usuli bor. Shamol qayerdan esayotganini his qilyapsizmi? Taxmin qilishga harakat qiling!

Yechim

Java-da muammoni hal qilish uchun kod:
public class ExecutableComment {
    public static void main(String[] args) {
        // комментарий ниже будет выполнен!
        // \u000d System.out.println("выполняемый комментарий");
    }
}
Agar biz ushbu vazifa uchun kodni Java-da IDE-da yozsak, biz quyidagilarni olamiz:
выполняемый комментарий
Sababi, Java kompilyatori Unicod belgisini \u000dyangi satr sifatida o'qiydi va bizning kodni quyidagicha o'qiydi: Kompilyator Java'dagi muammoni hal qilish uchun kodni dekodladi:
public class ExecutableComment {
    public static void main(String[] args) {
        // the line below this gives an output
        // \u000d
        System.out.println("comment executed");
    }
}

Java vazifasi - 3: Nomlangan tsikl yarating

"Amaliy dasturlash muammolari, sferik vakuumdagi Java" turkumining yana bir vakili. Buning nima uchun zarurligi aniq emasligi sababli, tsiklning shaxsiyatsizligi tufayli xafa bo'lishi dargumon. Xo'sh, yaxshi, yana bir narsa muhim: til sizga tsiklga nom berishga imkon beradi.

Yechim

Eslatma: ba'zilar uchun bunday "ismlar" "teglar" sifatida tanilgan, ulardan amalda foydalanish tavsiya etilmaydi. Java-da muammoni hal qilish uchun kod, nomli tsiklni namoyish qilish
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);
            }
        }
    }
}
Agar siz dasturni ishga tushirsangiz, natija shunday bo'ladi:
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
Bu yerda siz nomli sikl boshiga o'tish uchun davom etish tugmasidan ham foydalanishingiz mumkin. breakVa agar kerak bo'lsa, siz (yoki continue) dan foydalanib, bir nechta tsikllarni ajratish uchun -loop if-elseichida foydalanishingiz mumkin . Bu juda ko'p bayroqlarni o'rnatishdan va ichki tsiklni davom ettirish yoki chiqishni aniqlash uchun ularni sinab ko'rishdan qochishga yordam beradi. forif-elseif-else

Java muammosi - 4. Butun sonlar massividagi yagona dublikat haqida

1 dan 100 gacha boʻlgan elementlarni oʻz ichiga olgan butun sonlar massivi (yoki ArrayListxohlaganingizcha) berilgan. Bu massiv bitta va faqat bitta takrorlanuvchi elementga ega. IntegerUni qanday topish mumkin? Bunday vazifalar Java dasturchisiga oldingi uchtasiga qaraganda ko'proq tanish. Chunki gap tilning deyarli ishlatilmaydigan nozik tomonlarini bilish emas, balki mantiq haqida ketmoqda. Qo'pol kuch bilan hal qilish uchun birinchi jilovsiz impuls sizning boshingiz aylanganda yoki "men dasturchiman, men aqlliman" degan munosabat paydo bo'lganda juda tez yo'qoladi. Yagona yomon narsa shundaki, suhbat paytida, stress ostida, bu sodir bo'lmasligi mumkin. Shunday ekan, yechimni izlashdan oldin o‘ylab ko‘ring!

Yechim algoritmi quyidagicha:

1 dan 100 gacha bo'lgan barcha raqamlar yig'indisini hisoblang. Biz buni qanday qilishni bilasiz deb o'ylaymiz (masalan, mashhur Gauss usulidan foydalangan holda) Endi massivingizning elementlari yig'indisini hisoblang yoki ArrayList’а. Va... birinchi miqdorni ikkinchisidan ayirib tashlang. Bingo! Olingan raqam ikki nusxadagi elementning qiymati. Java uchun muammoni hal qilish kodi 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);
    }
}
Boshqa yechim
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 muammosi - 5. Butun sonlar massividagi noyob bo'lmagan dublikat haqida

Agar oldingi muammo sizga juda oson tuyulgan bo'lsa, quyidagini hal qilib ko'ring: 1 dan 100 gacha bo'lgan butun sonlar varag'i berilgan. U dublikatlarni (birdan ortiq) o'z ichiga oladi. Bir necha marta sodir bo'lgan elementlarni qanday topish mumkin (elementning o'zini toping va uning necha marta sodir bo'lishini ko'rsating)?

Yechim

Bu erda eng mantiqiy yechim - kabi strukturadan foydalanish HashMap, chunki u ma'lumotlarni kalit-qiymat juftliklarida saqlaydi. Java muammosini hal qilish uchun 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);
    }
}

Xulosa

Amaliy Java muammolari juda farq qiladi va siz suhbatdoshingiz sizga qanday noma'lum jumboqni berishga qaror qilishini bilmaysiz. Biroq, har qanday adekvat ish beruvchi tushunadiki, sizning qiyin Java muammolarini hal qilish qobiliyatingizdan ko'ra , sizning ishingiz davomida duch keladiganlar kabi haqiqiy amaliy muammolarni hal qilish qobiliyatingiz muhimroqdir . Shuning uchun ularni iloji boricha ko'proq hal qiling. Shuning uchun JavaRush yaratilgan. Ushbu maqolani tayyorlashda geeksforgeeks materiallaridan foydalanilgan.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION