CodeGym /Java Blogu /Rastgele /Fark yaratan Java görevleri: merhaba, röportajlar!
John Squirrels
Seviye
San Francisco

Fark yaratan Java görevleri: merhaba, röportajlar!

grupta yayınlandı
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.
Fark yaratan Java görevleri: merhaba, röportajlar!  - 1
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

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 depolanabilecek Integer.MAX_VALUEmaksimum değerdir . intBu değere ulaşır ve artırırsanız, mümkün olan en düşük değere, daha doğrusu, Integer.MAX_VALUEgeri 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_VALUEIntegerintstart

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 \u000dyeni 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. breakVe gerekirse, (veya continue) öğesini if-elsebir döngü ile iç içe forkullanarak birkaç döngüyü ayırmak için kullanabilirsiniz if-else. Bu, çok sayıda bayrak oluşturmaktan ve if-elseiç 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 kadar ArrayListher birini içeren bir tamsayı dizisi (veya tercih ederseniz bir ) verilir . Dizinin bir ve yalnızca bir yinelenen öğesi vardır. IntegerBunu 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 veya ArrayList. 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);
    }
}

Çözüm

Pek çok farklı türde pratik Java görevi vardır ve görüşmecinin sizden ne tür bulmacaları çözmenizi isteyeceğini bilemezsiniz. Ancak, herhangi bir mantıklı işveren , işte karşılaşacağınız görevler gibi gerçek pratik görevleri tamamlama becerinizin hileli soruları çözme becerinizden çok daha önemli olduğunu bilir . O yüzden bunları mümkün olduğunca yapın. CodeGym'i bu yüzden yarattık. Bu makaleyi oluşturmak için geeksforgeeks'ten malzeme kullanıldı.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION