JavaRush /Java Blog /Random-ID /Masalah Java dengan sebuah trik: Halo, wawancara!

Masalah Java dengan sebuah trik: Halo, wawancara!

Dipublikasikan di grup Random-ID
Bagi pelajar JavaRush , tantangan pemrograman, Java, dan validator adalah teman terbaik. Namun, ada saatnya bagi setiap pengembang Padawan ketika dia terkadang harus mulai keluar jalur, membuat proyek kecil untuk dirinya sendiri, dan bersiap untuk wawancara. Pada wawancara, tampaknya Anda akan menghadapi masalah praktis Java yang sama persis seperti dalam kursus. Dalam kebanyakan kasus, hal ini benar, namun beberapa perusahaan suka menanyakan pertanyaan jebakan atau sesuatu yang tidak biasa. Untuk menghindari kebingungan selama wawancara yang menegangkan, ada gunanya mencoba menyelesaikan sendiri masalah Java tersebut, di rumah.
Masalah Java dengan sebuah trik: Halo, wawancara!  - 1
Pada artikel ini kita akan melihat setengah lusin tugas rumit ini. Kami menyarankan Anda membaca terlebih dahulu kondisinya dan mencoba menyelesaikannya sendiri. Dan satu hal lagi: jangan lupa untuk menyelesaikan soal Java dari kursus setiap hari!

Masalah Java - 1: Membuat loop tak terbatas dari awal

Diberikan satu blok kode. Selesaikan sehingga loop menjadi tak terbatas.
class ToInfinity {
    public static void main(String[] args) {

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

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
“Tidak ada yang rumit,” katamu. Kemungkinan besar, Anda pernah mengalami situasi ini lebih dari sekali: saat memecahkan masalah Java, Anda membuat loop tak terbatas dan memikirkan cara menghilangkannya. Sebaliknya. Triknya adalah siklus itu sendiri dan kondisi untuk keluar darinya tidak dapat diubah. Hanya ada dua iterasi. Namun, jumlahnya cukup untuk membuat putaran tak terbatas. Sepertinya ini hanya berfungsi untuk dua iterasi, tetapi dapat dibuat tak terbatas dengan menggunakan overflow. Apakah Anda sudah menebak caranya?

Larutan

Karena meluap. Integer.MAX_VALUEadalah nilai maksimum yang intdapat disimpan di Java. Jika Anda mencapai Integer.MAX_VALUEdan menaikkan nilai ini, Anda akan melakukan roll down ke Integer.MIN_VALUE, yaitu ke nilai minimum Integer. Jadi, untuk mengatasi masalah Java ini, kita hanya perlu memberikan startnilai pada variabel yang kurang dari 1 dari nilai maksimum untuk tipe data tersebut int. Kode tugas di 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 terjadi? Kita mulai dengan start=2147483645 (Integer.MAX_VALUE-1), pada iterasi berikutnya nilainya menjadi 2147483645, lalu 2147483646, lalu -2147483648, -2147483647... dan seterusnya.

Tugas Java-2 Buat komentar yang akan dieksekusi

Nah, ini dia! Dari perkuliahan pertama kami mendengar bahwa komentar tidak dieksekusi. Itu sebabnya mereka berkomentar. Kami berpikir bahwa solusi untuk masalah ini tidak selalu jelas bagi seorang programmer Java, bahkan seorang programmer berpengalaman sekalipun. Namun, ada satu cara rumit untuk memaksa mesin Java menjalankan komentar secara “legal” untuk dieksekusi. Apakah Anda merasakan dari mana angin bertiup? Mencoba menebak!

Larutan

Kode untuk memecahkan masalah di Java:
public class ExecutableComment {
    public static void main(String[] args) {
        // комментарий ниже будет выполнен!
        // \u000d System.out.println("выполняемый комментарий");
    }
}
Jika kita mengetikkan kode untuk tugas ini di Java di IDE, inilah yang kita dapatkan:
выполняемый комментарий
Alasannya adalah kompiler Java membaca karakter Unicod \u000dsebagai baris baru, dan membaca kode kita sebagai berikut: Kompiler menguraikan kode untuk memecahkan masalah di Java:
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: Membuat loop bernama

Perwakilan lain dari seri “masalah pemrograman praktis, Java dalam ruang hampa”. Dalam artian tidak jelas mengapa hal ini perlu, kecil kemungkinannya siklus tersebut merasa tersinggung oleh kenyataan bahwa siklus tersebut bersifat impersonal. Baiklah, ada hal lain yang penting: bahasa memungkinkan Anda memberi nama pada siklus tersebut.

Larutan

Catatan: bagi sebagian orang, “nama” tersebut dikenal sebagai “tag”, yang tidak disarankan untuk digunakan dalam praktik. Kode untuk memecahkan masalah di Java, menunjukkan loop 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);
            }
        }
    }
}
Ini adalah output yang akan Anda dapatkan jika Anda menjalankan program ini:
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 dapat menggunakan continue untuk menuju ke awal perulangan bernama. Dan jika perlu, Anda dapat menggunakan break(atau continue) dalam loop if-elsewith for- yang bersarang untuk memecah beberapa loop menggunakan if-else. Ini akan membantu menghindari pengaturan banyak tanda dan mengujinya if-elseuntuk mengetahui apakah akan melanjutkan atau keluar dari loop dalam.

Masalah Java - 4. Tentang satu-satunya duplikat dalam array bilangan bulat

Diberikan sebuah array (atau ArrayList, sesuai keinginan Anda) bilangan bulat yang berisi elemen Integerdari 1 hingga 100. Array ini memiliki satu dan hanya satu elemen duplikat. Bagaimana cara menemukannya? Tugas seperti ini lebih familiar bagi programmer Java dibandingkan tiga tugas sebelumnya. Karena ini bukan tentang mengetahui seluk-beluk bahasa yang hampir tidak pernah digunakan, melainkan tentang logika. Dorongan pertama yang tidak terkendali untuk menyelesaikan dengan kekerasan menghilang dengan cepat ketika kepala Anda berputar atau ada sikap “Saya seorang programmer, saya pintar.” Satu-satunya hal buruk adalah selama wawancara, di bawah tekanan, hal ini mungkin tidak terjadi. Jadi pikirkan sekarang sebelum Anda mencari solusinya!

Algoritma solusinya adalah sebagai berikut:

Hitung jumlah semua angka dari 1 hingga 100. Kami rasa Anda sudah tahu cara melakukannya (misalnya, menggunakan metode Gauss yang terkenal) Sekarang hitung jumlah elemen array atau ArrayList’а. Dan... kurangi jumlah pertama dari jumlah kedua. Bingo! Angka yang dihasilkan adalah nilai elemen duplikat. Kode solusi 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);
    }
}
Solusi lain
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. Tentang duplikat non-unik dalam array bilangan bulat

Jika soal sebelumnya tampak terlalu mudah bagi Anda, cobalah selesaikan soal berikut: diberikan selembar bilangan bulat dari 1 hingga 100. Berisi duplikat (lebih dari satu). Bagaimana cara menemukan unsur yang muncul lebih dari satu kali (temukan unsur itu sendiri dan tunjukkan berapa kali kemunculannya)?

Larutan

Solusi paling logis di sini adalah dengan menggunakan struktur seperti HashMap, karena struktur ini menyimpan data dalam pasangan nilai kunci. Kode untuk memecahkan 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

Soal praktis Java sangat berbeda, dan Anda tidak tahu teka-teki apa yang akan diberikan pewawancara kepada Anda. Namun, setiap perusahaan yang memadai memahami bahwa yang jauh lebih penting daripada kemampuan untuk memecahkan masalah-masalah rumit Java adalah kemampuan Anda untuk memecahkan masalah-masalah praktis yang nyata , seperti yang akan Anda temui selama bekerja. Jadi selesaikan sebanyak mungkin. Inilah sebabnya JavaRush dibuat. Bahan dari geeksforgeeks digunakan dalam mempersiapkan artikel ini.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION