CodeGym /Blog Java /rawak /Tugas Java dengan kelainan: helo, temu bual!
John Squirrels
Tahap
San Francisco

Tugas Java dengan kelainan: helo, temu bual!

Diterbitkan dalam kumpulan
Rakan baik pelajar CodeGym ialah tugas pengaturcaraan, Java dan pengesah tugas. Namun, akan tiba masanya setiap pemaju padawan mesti mula keluar dari laluan terpencil, mencipta projek mini sendiri, dan menyediakan dirinya untuk temu duga. Seseorang akan berfikir bahawa temu bual akan mempunyai tugas Java praktikal yang sama yang terdapat dalam kursus ini. Begitu juga dalam kebanyakan kes, tetapi sesetengah syarikat suka bertanya soalan helah atau sesuatu yang tidak biasa. Untuk mengelak daripada gelisah semasa temu duga yang menimbulkan tekanan, adalah berguna untuk mencuba menyelesaikan tugas Java yang serupa sendiri di rumah.
Tugas Java dengan kelainan: helo, temu bual!  - 1
Dalam artikel ini, kami akan meneroka 5 tugasan rumit tersebut. Kami mengesyorkan agar anda membaca terlebih dahulu syarat dan cuba menyelesaikannya sendiri. Dan satu lagi: jangan lupa untuk melakukan tugas Java dalam kursus ini setiap hari!

Tugasan 1: Buat gelung tak terhingga dari awal

Satu blok kod telah disediakan. Tambahkan padanya untuk menjadikan gelung tidak terhingga.

class ToInfinity {
    public static void main(String[] args) {

// Insert code here

        for (int i = start; i <= start + 1; i++) {
             /* This should be an infinite loop, but don't change anything here */
        }
    }
}
" Itu tidak sukar, " kata anda. Anda berkemungkinan besar mendapati diri anda dalam senario ini berulang kali: semasa menyelesaikan tugas Java, anda mencipta gelung tak terhingga dan perlu memikirkan cara untuk menyingkirkannya. Nah, ini adalah sebaliknya. Inilah bahagian yang sukar: anda tidak boleh menukar gelung itu sendiri atau keadaan keluarnya. Terdapat hanya dua lelaran. Tetapi, mereka cukup untuk mencipta gelung tak terhingga. Nampaknya ia hanya perlu dilaksanakan untuk dua lelaran, tetapi anda boleh menjadikannya tidak terhingga menggunakan limpahan. Adakah anda sudah meneka bagaimana?

Penyelesaian

Disebabkan limpahan, Integer.MAX_VALUEialah nilai maksimum yang intboleh disimpan dalam Java. Jika anda mencapai Integer.MAX_VALUEdan menambah nilai ini, anda kembali ke Integer.MIN_VALUE, atau sebaliknya, ke nilai terendah yang mungkin Integer. Oleh itu, untuk menyelesaikan tugas Java ini, kita hanya perlu menetapkan 1 kurang daripada intnilai maksimum kepada startpembolehubah. Kod Java untuk tugas ini:

class ToInfinity {
    public static void main(String[] args) {
        int start = Integer.MAX_VALUE - 1;
        for (int i = start; i <= start + 1; i++) {
            // Infinite loop
            System.out.println(i); // Be sure we are in an infinite loop
        }
    }
}
Apa yang berlaku? Kita mulakan dengan mula=2147483645 (Integer.MAX_VALUE-1). Dalam lelaran seterusnya, nilai menjadi 2147483645, kemudian 2147483646, kemudian -2147483648, -2147483647... dan seterusnya.

Tugasan 2: Buat ulasan boleh laku

Nah, di sini kita! Dari pelajaran pertama, kami telah mendengar bahawa ulasan tidak dilaksanakan. Itulah sebabnya mereka dipanggil komen. Kami berpendapat bahawa penyelesaian kepada tugas ini tidak akan sentiasa jelas kepada pengaturcara Java, malah yang berpengalaman. Walau bagaimanapun, terdapat satu cara yang rumit (tetapi "sah") untuk membuat JVM melaksanakan ulasan. Bolehkah anda rasa ke mana arah tuju kami? Cuba teka!

Penyelesaian

Kod Java untuk tugas ini:

public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d System.out.println("executable comment");
    }
}
Jika kita memasukkan kod Java ini ke dalam IDE, inilah yang kita akan dapat:

executable comment
Ini kerana pengkompil Java mentafsir aksara Unicode \u000dsebagai baris baharu, dan membaca kod kami seperti ini: Kod Java untuk tugas ini, seperti yang ditafsirkan oleh pengkompil:

public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d
        System.out.println("comment executed");
    }
}

Tugasan 3: Buat gelung bernama

Berikut ialah ahli siri lain yang bertajuk "Masalah Pengaturcaraan Java Praktikal untuk Lembu Sfera". Dalam erti kata yang tidak jelas mengapa ini perlu: tidak mungkin gelung itu akan tersinggung dengan fakta bahawa ia tidak diberi nama. Bagaimanapun, ini penting atas sebab lain: bahasa membolehkan anda menamakan gelung.

Penyelesaian

Nota: "nama" ini dikenali oleh sesetengah orang sebagai "label", dan mereka tidak disyorkan untuk digunakan dalam amalan. Kod Java untuk 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 yang akan dikeluarkan 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
Anda juga boleh menggunakan kata kunci terus untuk kembali ke permulaan gelung bernama. Dan jika perlu, anda boleh menggunakan break(atau continue) dalam bersarang if-elsedengan forgelung untuk memecahkan beberapa gelung menggunakan if-else. Ini akan membantu mengelak daripada mencipta sejumlah besar bendera dan menyemaknya dalam if-elsepernyataan untuk menentukan sama ada untuk meneruskan atau keluar dari gelung dalam.

Tugasan 4: Cari pendua tunggal dalam tatasusunan integer

Anda diberi tatasusunan integer (atau ArrayList, jika anda lebih suka) yang mengandungi setiap Integerdaripada 1 hingga 100. Tatasusunan mempunyai satu, dan hanya satu, elemen pendua. Bagaimana anda mencarinya? Adalah lebih biasa bagi pengaturcara Java untuk mendapatkan jenis tugasan ini daripada tiga sebelumnya. Kerana ia adalah mengenai logik dan bukannya pengetahuan anda tentang kehalusan bahasa yang jarang digunakan. Dorongan pertama anda yang tidak terkawal untuk menggunakan kekerasan akan berlalu dengan agak cepat apabila otak anda bermula atau anda menyedari "Saya seorang pengaturcara. Saya bijak." Satu-satunya masalah ialah semasa temu duga, apabila anda mengalami tekanan, ini mungkin tidak berlaku. Jadi fikir sekarang sebelum anda melihat penyelesaiannya!

Inilah algoritmanya

Kira jumlah semua nombor dari 1 hingga 100. Kami fikir anda tahu bagaimana anda boleh melakukan ini (contohnya, menggunakan kaedah terkenal Gauss). Sekarang hitung jumlah elemen dalam tatasusunan anda atau ArrayList. Dan... tolak jumlah pertama daripada yang kedua. Bingo! Nombor yang terhasil ialah nilai elemen pendua. Kod Java untuk tugasan ini menggunakan 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();
// Find the sum of all list elements
        int totalSum = elements.stream().mapToInt(e -> e).sum();
        System.out.println("The repeated element is: " + (totalSum - distinctSum));
    }

    public static void main(String[] args) {
// Create a list of sequential elements in the interval [1..101).
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
// Add the value 23 at index 53
        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);
        }
        // Add a duplicate to the list
        numbers.add(25);
        Duplicate dn = new Duplicate();
        System.out.println("The repeated element is: " + dn.findDuplicateNumber(numbers));
    }
}

Tugasan 5: Cari pendua bukan unik dalam tatasusunan integer

Jika tugasan sebelumnya terlalu mudah untuk anda, cuba lakukan yang ini: Anda diberi senarai integer dari 1 hingga 100. Terdapat pendua di dalamnya (lebih daripada satu). Bagaimanakah anda mencari unsur yang berlaku lebih daripada sekali (cari unsur dan nyatakan berapa kali ia berlaku)?

Penyelesaian

Di sini penyelesaian logiknya ialah menggunakan sesuatu seperti HashMap, kerana ia menyimpan data dalam pasangan nilai kunci. Kod untuk tugas ini dalam 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 <>();
// Use the following rule to populate the Map duplicates:
// the key is the element value, and the value is the number of times it occurs
        elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
// Remove any elements that don't occur more than once from the Map duplicates
// and store the result as a list (to make it easy to work with in the next step)
        List <Map.Entry <Integer, Integer> >
        result = duplicates.entrySet().stream().filter(d -> d.getValue() > 1).collect(Collectors.toList());
// Write the results for all elements to the result list
        result.forEach(e -> System.out.println(String.format("Element %d  occurs %d times", 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

Terdapat banyak jenis tugas praktikal Java yang berbeza, dan anda tidak tahu jenis teka-teki yang akan diminta oleh penemuduga anda untuk diselesaikan. Tetapi, mana-mana majikan yang bijak memahami bahawa keupayaan anda untuk menyelesaikan tugas praktikal sebenar , seperti yang anda akan hadapi semasa kerja, adalah lebih penting daripada keupayaan anda untuk menyelesaikan soalan helah. Jadi lakukan ini sebanyak mungkin. Itulah sebabnya kami mencipta CodeGym. Bahan daripada geeksforgeeks telah digunakan untuk mencipta artikel ini.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION