Die besten Freunde von CodeGym- Studenten sind Programmieraufgaben, Java und der Task-Validator. Dennoch kommt irgendwann der Zeitpunkt, an dem jeder Padawan-Entwickler anfangen muss, ausgetretene Pfade zu verlassen, seine eigenen Miniprojekte zu erfinden und sich auf Interviews vorzubereiten. Man könnte meinen, dass das Interview genau die gleichen praktischen Java-Aufgaben beinhalten würde, die in diesem Kurs zu finden sind. Und das ist in den meisten Fällen der Fall, aber manche Unternehmen stellen gerne Fangfragen oder etwas Unbekanntes. Um während eines stressigen Vorstellungsgesprächs nicht verunsichert zu werden, ist es hilfreich, zu Hause zu versuchen, ähnliche Java-Aufgaben selbst zu lösen.
In diesem Artikel gehen wir auf fünf dieser kniffligen Aufgaben ein. Wir empfehlen Ihnen, zunächst die Bedingungen zu lesen und selbst zu versuchen, sie zu lösen. Und noch etwas: Vergessen Sie nicht, jeden Tag Java-Aufgaben in diesem Kurs zu erledigen!

- Aufgabe 1: Erstellen Sie eine Endlosschleife von Grund auf
- Aufgabe 2: Erstellen Sie einen ausführbaren Kommentar
- Aufgabe 3: Erstellen Sie eine benannte Schleife
- Aufgabe 4: Finden Sie ein einzelnes Duplikat in einem Array von Ganzzahlen
- Aufgabe 5: Finden Sie ein nicht eindeutiges Duplikat in einem Array von Ganzzahlen
Aufgabe 1: Erstellen Sie eine Endlosschleife von Grund auf
Es wurde ein Codeblock bereitgestellt. Fügen Sie es hinzu, um die Schleife unendlich zu machen.
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 */
}
}
}
„ Das ist nicht schwer “, sagen Sie. Höchstwahrscheinlich haben Sie sich schon oft in diesem Szenario wiedergefunden: Während Sie eine Java-Aufgabe erledigten, haben Sie eine Endlosschleife erstellt und mussten darüber nachdenken, wie Sie diese wieder loswerden. Nun, das ist umgekehrt. Hier ist der knifflige Teil: Sie können die Schleife selbst oder ihre Beendigungsbedingungen nicht ändern. Es gibt nur zwei Iterationen. Sie reichen jedoch aus, um eine Endlosschleife zu erzeugen. Es sieht so aus, als ob es nur für zwei Iterationen ausgeführt werden sollte, aber Sie können es mit Überlauf auf unendlich machen. Haben Sie schon erraten, wie?
Lösung
Aufgrund eines ÜberlaufsInteger.MAX_VALUE
ist dies der maximale Wert, den ein int
in Java speichern kann. Wenn Sie Integer.MAX_VALUE
diesen Wert erreichen und erhöhen, erfolgt ein Rollback auf Integer.MIN_VALUE
bzw. auf den niedrigstmöglichen Integer
Wert. Um diese Java-Aufgabe abzuschließen, müssen wir int
der start
Variablen lediglich 1 weniger als den Maximalwert zuweisen. Java-Code für diese Aufgabe:
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
}
}
}
Was geschieht? Wir beginnen mit start=2147483645 (Integer.MAX_VALUE-1). In der nächsten Iteration wird der Wert zu 2147483645, dann zu 2147483646, dann zu -2147483648, -2147483647 ... und so weiter.
Aufgabe 2: Erstellen Sie einen ausführbaren Kommentar
Gut, da wären wir! Schon in den ersten Lektionen haben wir gehört, dass Kommentare nicht ausgeführt werden. Deshalb werden sie Kommentare genannt. Wir glauben, dass die Lösung dieser Aufgabe für Java-Programmierer, selbst für erfahrene, nicht immer offensichtlich sein wird. Es gibt jedoch eine knifflige (aber „legale“) Möglichkeit, die JVM dazu zu bringen, einen Kommentar auszuführen. Spüren Sie, wohin wir gehen? Versuchen zu erraten!Lösung
Java-Code für diese Aufgabe:
public class ExecutableComment {
public static void main(String[] args) {
// The comment below will be executed!
// \u000d System.out.println("executable comment");
}
}
Wenn wir diesen Java-Code in eine IDE eingeben, erhalten wir Folgendes:
executable comment
Dies liegt daran, dass der Java-Compiler das Unicode-Zeichen \u000d
als neue Zeile interpretiert und unseren Code wie folgt liest: Java-Code für diese Aufgabe, wie er vom Compiler interpretiert wird:
public class ExecutableComment {
public static void main(String[] args) {
// The comment below will be executed!
// \u000d
System.out.println("comment executed");
}
}
Aufgabe 3: Erstellen Sie eine benannte Schleife
Hier ist ein weiteres Mitglied der Reihe mit dem Titel „Praktische Java-Programmierprobleme für sphärische Kühe“. In dem Sinne, dass unklar ist, warum dies überhaupt notwendig ist: Es ist unwahrscheinlich, dass die Schleife dadurch beleidigt wird, dass ihr kein Name gegeben wurde. Auf jeden Fall ist es aus einem anderen Grund wichtig: Mit der Sprache können Sie eine Schleife benennen.Lösung
Hinweis: Einige Leute kennen diese „Namen“ als „Etiketten“ und ihre Verwendung in der Praxis wird nicht empfohlen. Java-Code zur Demonstration einer benannten Schleife
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);
}
}
}
}
Folgendes wird ausgegeben, wenn Sie das Programm ausführen:
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
Sie können auch das Schlüsselwort continue verwenden, um zum Anfang einer benannten Schleife zurückzukehren. Und bei Bedarf können Sie break
(oder continue
) in einer if-else
mit einer for
Schleife verschachtelten Schleife verwenden, um mehrere Schleifen mithilfe einer zu unterbrechen if-else
. Dadurch wird vermieden, dass eine große Anzahl von Flags erstellt und in einer if-else
Anweisung überprüft wird, um zu bestimmen, ob die innere Schleife fortgesetzt oder verlassen werden soll.
Aufgabe 4: Finden Sie ein einzelnes Duplikat in einem Array von Ganzzahlen
Sie erhalten ein Ganzzahl-Array (oder einArrayList
, wenn Sie es vorziehen), das alle Zahlen Integer
von 1 bis 100 enthält. Das Array enthält ein und nur ein doppeltes Element. Wie findest Du es? Es kommt häufiger vor, dass ein Java-Programmierer diese Art von Aufgabe erhält als die vorherigen drei. Weil es eher um Logik als um Ihr Wissen über selten verwendete Feinheiten der Sprache geht. Ihr erster ungezügelter Impuls, rohe Gewalt anzuwenden, wird ziemlich schnell vergehen, wenn Ihr Gehirn einschaltet oder Ihnen klar wird: „Ich bin Programmierer. Ich bin schlau.“ Das einzige Problem besteht darin, dass dies während eines Vorstellungsgesprächs, wenn Sie unter Stress stehen, möglicherweise nicht passiert. Denken Sie also jetzt nach, bevor Sie sich die Lösung ansehen!
Hier ist der Algorithmus
Berechnen Sie die Summe aller Zahlen von 1 bis 100. Wir denken, Sie wissen, wie Sie das machen können (zum Beispiel mit der berühmten Methode von Gauß). Berechnen Sie nun die Summe der Elemente in Ihrem Array oderArrayList
. Und... subtrahiere die erste Summe von der zweiten. Bingo! Die resultierende Zahl ist der Wert des doppelten Elements. Java-Code für diese Aufgabe mit einer 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);
}
}
Eine andere Lösung
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));
}
}
Aufgabe 5: Finden Sie ein nicht eindeutiges Duplikat in einem Array von Ganzzahlen
Wenn die vorherige Aufgabe für Sie zu einfach war, versuchen Sie es mit dieser: Sie erhalten eine Liste mit ganzen Zahlen von 1 bis 100. Darin sind Duplikate (mehr als eine) enthalten. Wie finden Sie die Elemente, die mehr als einmal vorkommen (finden Sie die Elemente und geben Sie an, wie oft sie vorkommen)?Lösung
Hier wäre die logische Lösung, so etwas wie eine HashMap zu verwenden, da diese die Daten in Schlüssel-Wert-Paaren speichert. Code für diese Aufgabe in 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