CodeGym öğrencilerinin en iyi arkadaşları programlama görevleri, Java ve görev doğrulayıcıdır. Yine de, her padawan geliştiricisinin alışılmışın dışında yürümeye başlaması, kendi mini projelerini icat etmesi ve kendisini mülakatlara hazırlaması gereken bir zaman gelir. Röportajın bu kursta bulunan pratik Java görevlerinin tamamen aynısı olacağı düşünülebilir. Ve çoğu durumda böyledir, ancak bazı şirketler hileli sorular veya alışılmadık şeyler sormayı sever. Stresli bir görüşme sırasında sarsılmamak için benzer Java görevlerini evde kendi başınıza çözmeyi denemek faydalı olacaktır.
Bu yazıda, bu tür 5 zorlu görevi inceleyeceğiz. Öncelikle koşulları okumanızı ve kendiniz çözmeyi denemenizi öneririz. Ve bir şey daha: Bu kursta her gün Java görevleri yapmayı unutmayın!

- Görev 1: Sıfırdan sonsuz bir döngü oluşturun
- Görev 2: Yürütülebilir bir yorum oluşturun
- Görev 3: Adlandırılmış bir döngü oluşturun
- Görev 4: Bir tam sayı dizisinde tek bir kopya bulun
- Görev 5: Bir tam sayı dizisinde benzersiz olmayan bir kopya bulun
Görev 1: Sıfırdan sonsuz bir döngü oluşturun
Bir kod bloğu sağlandı. Döngüyü sonsuz yapmak için ekleyin.
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 */
}
}
}
“ Zor değil ” diyorsun. Muhtemelen kendinizi bu senaryoda defalarca bulmuşsunuzdur: Bir Java görevini tamamlarken sonsuz bir döngü oluşturdunuz ve bundan nasıl kurtulacağınızı düşünmek zorunda kaldınız. Peki, bu tam tersi. İşin zor kısmı burada: döngünün kendisini veya çıkış koşullarını değiştiremezsiniz. Sadece iki yineleme var. Ancak sonsuz bir döngü oluşturmak için yeterlidirler. Görünüşe göre yalnızca iki yineleme için yürütülmeli, ancak taşma kullanarak onu sonsuz yapabilirsiniz. Nasıl olduğunu zaten tahmin ettin mi?
Çözüm
Taşma nedeniyle, bir Java'da depolanabilecekInteger.MAX_VALUE
maksimum değerdir . int
Bu değere ulaşır ve artırırsanız, mümkün olan en düşük değere, daha doğrusu, Integer.MAX_VALUE
geri dönersiniz . Bu nedenle, bu Java görevini tamamlamak için, değişkene maksimum değerden 1 eksik atamamız yeterlidir . Bu görev için Java kodu: Integer.MIN_VALUE
Integer
int
start
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
}
}
}
Ne oluyor? start=2147483645 (Integer.MAX_VALUE-1) ile başlıyoruz. Bir sonraki yinelemede, değer 2147483645, sonra 2147483646, sonra -2147483648, -2147483647... ve böyle devam eder.
Görev 2: Yürütülebilir bir yorum oluşturun
İşte burdayız! İlk derslerden beri, yorumların yürütülmediğini duyduk. Bu yüzden bunlara yorum denir. Bu görevin çözümünün, deneyimli olanlar da dahil olmak üzere Java programcıları için her zaman açık olmayacağını düşünüyoruz. Ancak, JVM'nin bir yorum yürütmesini sağlamanın zor (ancak "yasal") bir yolu vardır. Nereye gittiğimizi hissedebiliyor musun? Tahmin etmeye çalış!Çözüm
Bu görev için Java kodu:
public class ExecutableComment {
public static void main(String[] args) {
// The comment below will be executed!
// \u000d System.out.println("executable comment");
}
}
Bu Java kodunu bir IDE'ye girersek, şunu elde ederiz:
executable comment
Bunun nedeni, Java derleyicisinin Unicode karakterini \u000d
yeni bir satır olarak yorumlaması ve kodumuzu şu şekilde okumasıdır: Bu görev için Java kodu, derleyici tarafından yorumlandığı şekliyle:
public class ExecutableComment {
public static void main(String[] args) {
// The comment below will be executed!
// \u000d
System.out.println("comment executed");
}
}
Görev 3: Adlandırılmış bir döngü oluşturun
İşte "Küresel İnekler İçin Pratik Java Programlama Problemleri" başlıklı serinin başka bir üyesi. Bunun neden gerekli olduğu bile belli değil: Döngünün kendisine bir isim verilmediği gerçeğinden rahatsız olması pek olası değil. Her neyse, başka bir nedenden dolayı önemlidir: dil, bir döngüyü adlandırmanıza izin verir.Çözüm
Not: Bu "isimler" bazı kişiler tarafından "etiket" olarak bilinir ve pratikte kullanılmaları önerilmez. Adlandırılmış bir döngüyü göstermek için Java kodu
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);
}
}
}
}
Programı çalıştırırsanız çıktısı şu şekilde olacaktır:
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
Adlandırılmış bir döngünün başına dönmek için devam anahtar kelimesini de kullanabilirsiniz. break
Ve gerekirse, (veya continue
) öğesini if-else
bir döngü ile iç içe for
kullanarak birkaç döngüyü ayırmak için kullanabilirsiniz if-else
. Bu, çok sayıda bayrak oluşturmaktan ve if-else
iç döngüden devam edip etmeyeceğinizi belirlemek için bunları bir ifadede kontrol etmekten kaçınmanıza yardımcı olacaktır.
Görev 4: Bir tam sayı dizisinde tek bir kopya bulun
Size 1'den 100'e kadarArrayList
her birini içeren bir tamsayı dizisi (veya tercih ederseniz bir ) verilir . Dizinin bir ve yalnızca bir yinelenen öğesi vardır. Integer
Bunu nasıl buluyorsun? Bir Java programcısının bu tür görevleri alması önceki üçünden daha yaygındır. Çünkü bu, dilin nadiren kullanılan inceliklerine ilişkin bilginizden çok mantıkla ilgilidir. Kaba kuvvet kullanmaya yönelik ilk dizginlenemeyen dürtünüz, beyniniz devreye girdiğinde veya "Ben bir programcıyım. Zekiyim." Tek sorun, bir görüşme sırasında, stres altındayken bu gerçekleşmeyebilir. Öyleyse çözüme bakmadan önce şimdi düşünün!
İşte algoritma
1'den 100'e kadar olan tüm sayıların toplamını hesaplayın. Bunu nasıl yapabileceğinizi bildiğinizi düşünüyoruz (örneğin, Gauss'un ünlü yöntemini kullanarak). Şimdi dizinizdeki öğelerin toplamını hesaplayın veyaArrayList
. Ve... ilk toplamı ikinciden çıkarın. Bingo! Ortaya çıkan sayı, yinelenen öğenin değeridir. Bu görev için Java kodu bir 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);
}
}
Başka bir çözüm
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));
}
}
Görev 5: Bir tam sayı dizisinde benzersiz olmayan bir kopya bulun
Önceki görev sizin için çok kolaysa, bunu yapmayı deneyin: Size 1'den 100'e kadar tam sayıların bir listesi verilir. İçinde kopyalar var (birden fazla). Birden fazla geçen öğeleri nasıl bulursunuz (öğeleri bulun ve kaç kez ortaya çıktıklarını belirtin)?Çözüm
Burada mantıksal çözüm HashMap gibi bir şey kullanmak olacaktır, çünkü verileri anahtar/değer çiftlerinde saklar. Java'da bu görev için 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 <>();
// 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