JavaRush /Blog Java /Random-MS /Masalah Java dengan helah: Hello, temu bual!

Masalah Java dengan helah: Hello, temu bual!

Diterbitkan dalam kumpulan
Bagi pelajar JavaRush , cabaran pengaturcaraan, Java dan pengesah adalah kawan baik. Walau bagaimanapun, ada masanya untuk setiap padawan pembangun apabila anda kadang-kadang perlu mula keluar dari landasan yang betul, tampil dengan projek mini untuk diri sendiri dan bersedia untuk temu duga. Pada temu bual, nampaknya anda harus menghadapi masalah Java praktikal yang sama seperti dalam kursus. Dalam kebanyakan kes ini adalah benar, tetapi sesetengah syarikat suka bertanya soalan helah atau sesuatu yang luar biasa. Untuk mengelakkan kekeliruan semasa temu duga yang tertekan, adalah berguna untuk mencuba menyelesaikan sendiri masalah Java seperti itu, di rumah.
Masalah Java dengan helah: Hello, temu bual!  - 1
Dalam artikel ini kita akan melihat setengah dozen tugas rumit ini. Kami mengesyorkan agar anda membaca terlebih dahulu syarat dan cuba menyelesaikannya sendiri. Dan satu lagi: jangan lupa untuk menyelesaikan masalah Java dari kursus setiap hari!

Masalah Java - 1: Mencipta gelung tak terhingga dari awal

Diberi blok kod. Lengkapkannya supaya gelung menjadi tidak terhingga.
class ToInfinity {
    public static void main(String[] args) {

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

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
"Tiada apa-apa yang rumit," anda berkata. Kemungkinan besar, anda telah mendapati diri anda dalam situasi ini lebih daripada sekali: semasa menyelesaikan masalah Java, anda mencipta gelung tak terhingga dan memikirkan cara untuk menyingkirkannya. Ia adalah sebaliknya. Caranya ialah kitaran itu sendiri dan syarat untuk keluar darinya tidak boleh diubah. Terdapat hanya dua lelaran. Walau bagaimanapun, terdapat cukup daripada mereka untuk mencipta gelung tak terhingga. Nampaknya ia hanya berfungsi untuk dua lelaran, tetapi ia boleh dijadikan tak terhingga dengan menggunakan limpahan. Adakah anda sudah meneka bagaimana?

Penyelesaian

Akibat limpahan. Integer.MAX_VALUEialah nilai maksimum yang intboleh disimpan dalam Java. Jika anda mencapai Integer.MAX_VALUEdan menambah nilai ini, anda turun ke Integer.MIN_VALUE, iaitu, ke nilai minimum Integer. Oleh itu, untuk menyelesaikan masalah Java ini, kita hanya perlu memberikan startnilai kepada pembolehubah yang 1 kurang daripada nilai maksimum untuk jenis data int. Kod tugas dalam Java:
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); //убеждаемся в бесконечности цикла
        }
    }
}
Apa yang berlaku? Kita mulakan dengan start=2147483645 (Integer.MAX_VALUE-1), pada lelaran seterusnya nilai menjadi 2147483645, kemudian 2147483646, kemudian -2147483648, -2147483647... dan seterusnya.

Tugas Java-2. Buat ulasan yang akan dilaksanakan

Nah, di sini kita! Dari kuliah pertama kami mendengar bahawa komen tidak dilaksanakan. Itulah yang mereka komen. Kami berpendapat bahawa penyelesaian kepada masalah ini tidak selalunya jelas untuk pengaturcara Java, malah yang berpengalaman. Walau bagaimanapun, terdapat satu cara rumit untuk memaksa mesin Java "secara sah" menjalankan ulasan untuk pelaksanaan. Adakah anda merasakan dari mana angin bertiup? Cuba teka!

Penyelesaian

Kod untuk menyelesaikan masalah dalam Java:
public class ExecutableComment {
    public static void main(String[] args) {
        // комментарий ниже будет выполнен!
        // \u000d System.out.println("выполняемый комментарий");
    }
}
Jika kita menaip kod untuk tugas ini dalam Java dalam IDE, inilah yang kita dapat:
выполняемый комментарий
Sebabnya ialah pengkompil Java membaca aksara Unicod \u000dsebagai baris baharu, dan membaca kod kami seperti berikut: Pengkompil mentafsir kod untuk menyelesaikan masalah di Jawa:
public class ExecutableComment {
    public static void main(String[] args) {
        // the line below this gives an output
        // \u000d
        System.out.println("comment executed");
    }
}

Tugas Java - 3: Buat gelung bernama

Seorang lagi wakil siri "masalah pengaturcaraan praktikal, Java dalam vakum sfera." Dalam erti kata yang tidak jelas mengapa ini perlu, tidak mungkin kitaran itu berasa tersinggung oleh fakta bahawa ia tidak bersifat peribadi. Baik, okey, sesuatu yang lain penting: bahasa membolehkan anda memberi nama kitaran.

Penyelesaian

Nota: kepada sesetengah orang, "nama" sedemikian dikenali sebagai "tag", yang tidak disyorkan untuk digunakan dalam amalan. Kod untuk menyelesaikan masalah dalam Java, menunjukkan gelung bernama
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);
            }
        }
    }
}
Inilah outputnya jika anda menjalankan program:
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
Di sini anda juga boleh menggunakan terus untuk pergi ke permulaan gelung bernama. Dan jika perlu, anda boleh menggunakan break(atau continue) dalam bersarang if-elsedengan for-gelung untuk memecahkan beberapa gelung menggunakan if-else. Ini akan membantu mengelak daripada menetapkan banyak bendera dan mengujinya if-elseuntuk mengetahui sama ada untuk meneruskan atau keluar dari gelung dalam.

Masalah Java - 4. Mengenai satu-satunya pendua dalam tatasusunan integer

Diberi tatasusunan (atau ArrayList, seperti yang anda suka) bagi integer yang mengandungi elemen Integerdari 1 hingga 100. Tatasusunan ini mempunyai satu dan hanya satu elemen pendua. Bagaimana untuk mencarinya? Tugas sedemikian lebih biasa kepada pengaturcara Java daripada tiga sebelumnya. Kerana ia bukan tentang mengetahui kehalusan bahasa, yang hampir tidak pernah digunakan, tetapi tentang logik. Dorongan pertama yang tidak terkawal untuk diselesaikan dengan kekerasan hilang dengan cepat apabila kepala anda dihidupkan atau terdapat sikap "Saya seorang pengaturcara, saya bijak." Satu-satunya perkara yang buruk ialah semasa temuduga, di bawah tekanan, ini mungkin tidak berlaku. Jadi fikir sekarang sebelum anda melihat penyelesaiannya!

Algoritma penyelesaian adalah seperti berikut:

Kira jumlah semua nombor dari 1 hingga 100. Kami fikir anda tahu cara melakukannya (contohnya, menggunakan kaedah Gauss yang terkenal). Sekarang hitung jumlah unsur tatasusunan anda atau ArrayList’а. Dan... tolak jumlah pertama daripada yang kedua. Bingo! Nombor yang terhasil ialah nilai elemen pendua. Kod penyelesaian masalah Java untuk 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);
    }
}
Satu lagi penyelesaian
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));
    }
}

Masalah Java - 5. Mengenai pendua bukan unik dalam tatasusunan integer

Jika masalah sebelumnya kelihatan terlalu mudah kepada anda, maka cuba selesaikan yang berikut: diberikan helaian integer dari 1 hingga 100. Ia mengandungi pendua (lebih daripada satu). Bagaimana untuk mencari elemen yang berlaku lebih daripada sekali (cari elemen itu sendiri dan nyatakan berapa kali ia berlaku)?

Penyelesaian

Penyelesaian yang paling logik di sini ialah menggunakan struktur seperti HashMap, kerana ia menyimpan data dalam pasangan nilai kunci. Kod untuk menyelesaikan masalah Java:
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);
    }
}

Kesimpulan

Masalah Java praktikal sangat berbeza, dan anda tidak tahu jenis teka-teki yang tidak diketahui yang akan diberikan oleh penemuduga kepada anda. Walau bagaimanapun, mana-mana majikan yang mencukupi memahami bahawa lebih penting daripada keupayaan anda untuk menyelesaikan masalah Java yang rumit ialah keupayaan anda untuk menyelesaikan masalah praktikal sebenar , seperti yang akan anda hadapi semasa bekerja. Jadi selesaikan mereka sebanyak mungkin. Inilah sebabnya JavaRush dicipta. Bahan daripada geeksforgeeks telah digunakan dalam menyediakan artikel ini.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION