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.
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
- Tugasan 2: Buat ulasan boleh laku
- Tugasan 3: Buat gelung bernama
- Tugasan 4: Cari pendua tunggal dalam tatasusunan integer
- Tugasan 5: Cari pendua bukan unik dalam tatasusunan integer
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_VALUE
ialah nilai maksimum yang int
boleh disimpan dalam Java. Jika anda mencapai Integer.MAX_VALUE
dan 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 int
nilai maksimum kepada start
pembolehubah. 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 \u000d
sebagai 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-else
dengan for
gelung untuk memecahkan beberapa gelung menggunakan if-else
. Ini akan membantu mengelak daripada mencipta sejumlah besar bendera dan menyemaknya dalam if-else
pernyataan untuk menentukan sama ada untuk meneruskan atau keluar dari gelung dalam.
Tugasan 4: Cari pendua tunggal dalam tatasusunan integer
Anda diberi tatasusunan integer (atauArrayList
, jika anda lebih suka) yang mengandungi setiap Integer
daripada 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 atauArrayList
. 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);
}
}
GO TO FULL VERSION