CodeGym/Blog Java/Random-PL/Zadania Java z niespodzianką: cześć, wywiady!
Autor
Pavlo Plynko
Java Developer at CodeGym

Zadania Java z niespodzianką: cześć, wywiady!

Opublikowano w grupie Random-PL
Najlepszymi przyjaciółmi uczniów CodeGym są zadania programistyczne, Java i walidator zadań. Jednak przychodzi taki czas, kiedy każdy padawan developer musi zacząć schodzić z utartych ścieżek, wymyślać własne mini-projekty i przygotowywać się do rozmów kwalifikacyjnych. Można by pomyśleć, że rozmowa kwalifikacyjna będzie zawierała dokładnie te same praktyczne zadania Java, które można znaleźć w tym kursie. I tak jest w większości przypadków, ale niektóre firmy lubią zadawać podchwytliwe pytania lub coś nieznanego. Aby uniknąć zdenerwowania podczas stresującej rozmowy kwalifikacyjnej, warto spróbować samodzielnie rozwiązać podobne zadania w języku Java w domu.
Zadania Java z niespodzianką: cześć, wywiady!  - 1
W tym artykule przyjrzymy się 5 takim trudnym zadaniom. Zalecamy najpierw przeczytać warunki i spróbować rozwiązać je samodzielnie. I jeszcze jedno: nie zapomnij codziennie wykonywać zadań Java na tym kursie!

Zadanie 1: Utwórz nieskończoną pętlę od podstaw

Dostarczono blok kodu. Dodaj do tego, aby pętla była nieskończona.
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 */
        }
    }
}
To nie jest trudne ”, mówisz. Najprawdopodobniej wielokrotnie znalazłeś się w tej sytuacji: podczas wykonywania zadania w Javie utworzyłeś nieskończoną pętlę i musiałeś pomyśleć, jak się jej pozbyć. Cóż, to jest na odwrót. Oto trudna część: nie możesz zmienić samej pętli ani jej warunków wyjścia. Są tylko dwie iteracje. Ale wystarczą, aby stworzyć nieskończoną pętlę. Wygląda na to, że powinien działać tylko przez dwie iteracje, ale możesz uczynić go nieskończonym za pomocą przepełnienia. Zgadłeś już jak?

Rozwiązanie

Ze względu na przepełnienie Integer.MAX_VALUEjest to maksymalna wartość, jaką intmożna przechowywać w Javie. Jeśli osiągniesz Integer.MAX_VALUEi zwiększysz tę wartość, cofniesz się do Integer.MIN_VALUE, a raczej do najniższej możliwej Integerwartości. Tak więc, aby ukończyć to zadanie Java, musimy po prostu przypisać zmiennej o 1 mniej niż intwartość maksymalna start. Kod Java dla tego zadania:
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
        }
    }
}
Co się dzieje? Zaczynamy od start=2147483645 (liczba całkowita.MAX_VALUE-1). W następnej iteracji wartość wynosi 2147483645, następnie 2147483646, następnie -2147483648, -2147483647... i tak dalej.

Zadanie 2: Utwórz wykonywalny komentarz

Cóż, oto jesteśmy! Od pierwszych lekcji słyszeliśmy, że komentarze nie są wykonywane. Dlatego nazywają się komentarzami. Uważamy, że rozwiązanie tego zadania nie zawsze będzie oczywiste dla programistów Java, nawet tych doświadczonych. Istnieje jednak jeden trudny (ale „legalny”) sposób, aby maszyna JVM wykonała komentarz. Czy wyczuwasz, dokąd zmierzamy? Spróbuj zgadnąć!

Rozwiązanie

Kod Java dla tego zadania:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d System.out.println("executable comment");
    }
}
Jeśli wprowadzimy ten kod Java do IDE, oto co otrzymamy:
executable comment
Dzieje się tak, ponieważ kompilator Java interpretuje znak Unicode \u000djako nową linię i odczytuje nasz kod w następujący sposób: Kod Java dla tego zadania, tak jak jest interpretowany przez kompilator:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d
        System.out.println("comment executed");
    }
}

Zadanie 3: Utwórz nazwaną pętlę

Oto kolejny członek serii zatytułowanej „Praktyczne problemy programowania w Javie dla kulistych krów”. W tym sensie, że nie jest jasne, dlaczego jest to w ogóle konieczne: jest mało prawdopodobne, aby pętla poczuła się urażona faktem, że nie nadano jej nazwy. W każdym razie jest to ważne z innego powodu: język pozwala nazwać pętlę.

Rozwiązanie

Uwaga: te "nazwy" są znane niektórym ludziom jako "etykiety" i nie zaleca się ich używania w praktyce. Kod Java do demonstrowania nazwanej pętli
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);
            }
        }
    }
}
Oto, co zostanie wyświetlone, jeśli uruchomisz 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
Możesz także użyć słowa kluczowego continue, aby powrócić do początku nazwanej pętli. A jeśli to konieczne, możesz użyć break(lub continue) w zagnieżdżonej if-elsepętli for, aby rozbić kilka pętli za pomocą if-else. Pomoże to uniknąć tworzenia dużej liczby flag i sprawdzania ich w instrukcji if-elsew celu ustalenia, czy kontynuować, czy wyjść z pętli wewnętrznej.

Zadanie 4: Znajdź pojedynczy duplikat w tablicy liczb całkowitych

Otrzymujesz tablicę liczb całkowitych (lub ArrayList, jeśli wolisz), która zawiera wszystkie liczby Integerod 1 do 100. Tablica zawiera jeden i tylko jeden zduplikowany element. Jak ty to znalazłeś? Programista Java częściej otrzymuje tego typu zadanie niż poprzednie trzy. Ponieważ chodzi bardziej o logikę niż o znajomość rzadko używanych subtelności języka. Twój pierwszy nieokiełznany impuls do użycia brutalnej siły minie dość szybko, gdy włączy się twój mózg lub zdasz sobie sprawę, że „jestem programistą. Jestem mądry”. Jedynym problemem jest to, że podczas rozmowy kwalifikacyjnej, kiedy jesteś w stresie, może się to nie zdarzyć. Więc pomyśl teraz, zanim spojrzysz na rozwiązanie!

Oto algorytm

Oblicz sumę wszystkich liczb od 1 do 100. Myślimy, że wiesz, jak to zrobić (na przykład za pomocą słynnej metody Gaussa). Teraz oblicz sumę elementów w swojej tablicy lub ArrayList. I... odejmij pierwszą sumę od drugiej. Bingo! Wynikowa liczba jest wartością zduplikowanego elementu. Kod Java dla tego zadania przy użyciu pliku 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);
    }
}

Inne rozwiązanie

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));
    }
}

Zadanie 5: Znajdź nieunikatowy duplikat w tablicy liczb całkowitych

Jeśli poprzednie zadanie było dla Ciebie zbyt łatwe, spróbuj wykonać to: Dostajesz listę liczb całkowitych od 1 do 100. Są w niej duplikaty (więcej niż jeden). Jak znaleźć elementy, które występują więcej niż jeden raz (znajdź elementy i wskaż, ile razy występują)?

Rozwiązanie

Tutaj logicznym rozwiązaniem byłoby użycie czegoś w rodzaju HashMap, ponieważ przechowuje dane w parach klucz-wartość. Kod dla tego zadania w Javie:
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);
    }
}

Wniosek

Istnieje wiele różnych praktycznych zadań Java i nie wiesz, jakiego rodzaju łamigłówki poprosi Cię o rozwiązanie ankietera. Ale każdy rozsądny pracodawca rozumie, że twoja zdolność do wykonywania prawdziwych praktycznych zadań , takich jak te, które napotkasz w pracy, jest o wiele ważniejsza niż umiejętność rozwiązywania podchwytliwych pytań. Więc rób to tak często, jak to możliwe. Dlatego stworzyliśmy CodeGym. Do stworzenia tego artykułu wykorzystano materiał z geeksforgeeks .
Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy