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.
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
- Zadanie 2: Utwórz wykonywalny komentarz
- Zadanie 3: Utwórz nazwaną pętlę
- Zadanie 4: Znajdź pojedynczy duplikat w tablicy liczb całkowitych
- Zadanie 5: Znajdź nieunikatowy duplikat w tablicy liczb całkowitych
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łnienieInteger.MAX_VALUE
jest to maksymalna wartość, jaką int
można przechowywać w Javie. Jeśli osiągniesz Integer.MAX_VALUE
i zwiększysz tę wartość, cofniesz się do Integer.MIN_VALUE
, a raczej do najniższej możliwej Integer
wartości. Tak więc, aby ukończyć to zadanie Java, musimy po prostu przypisać zmiennej o 1 mniej niż int
wartość 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 \u000d
jako 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-else
pę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-else
w 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 (lubArrayList
, jeśli wolisz), która zawiera wszystkie liczby Integer
od 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 lubArrayList
. 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);
}
}
GO TO FULL VERSION