JavaRush /Java-Blog /Random-DE /Java-Probleme mit einem Trick: Hallo, Interviews!

Java-Probleme mit einem Trick: Hallo, Interviews!

Veröffentlicht in der Gruppe Random-DE
Für JavaRush- Studenten sind Programmierherausforderungen, Java und der Validator beste Freunde. Für jeden Entwickler-Padawan kommt jedoch der Zeitpunkt, an dem er ab und zu ausgetretene Pfade verlassen, sich Miniprojekte ausdenken und sich auf Interviews vorbereiten muss. Es scheint, dass Sie beim Vorstellungsgespräch auf genau die gleichen praktischen Java-Probleme stoßen werden wie im Kurs. In den meisten Fällen stimmt das, aber manche Unternehmen stellen gerne Fangfragen oder etwas Ungewöhnliches. Um während eines stressigen Vorstellungsgesprächs nicht verwirrt zu werden, ist es sinnvoll, solche Java-Probleme selbst zu Hause zu lösen.
Java-Probleme mit einem Trick: Hallo, Interviews!  - 1
In diesem Artikel werden wir uns ein halbes Dutzend dieser kniffligen Aufgaben ansehen. Wir empfehlen Ihnen, zunächst den Zustand zu lesen und zu versuchen, ihn selbst zu lösen. Und noch etwas: Vergessen Sie nicht, jeden Tag die Java-Aufgaben aus dem Kurs zu lösen!

Java-Problem – 1: Erstellen einer Endlosschleife von Grund auf

Gegeben sei ein Codeblock. Vervollständigen Sie es so, dass die Schleife unendlich wird.
class ToInfinity {
    public static void main(String[] args) {

//впишите Code сюда

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
„Nichts Kompliziertes“, sagen Sie. Höchstwahrscheinlich haben Sie sich mehr als einmal in dieser Situation befunden: Beim Lösen von Java-Problemen haben Sie eine Endlosschleife erstellt und darüber nachgedacht, wie Sie diese loswerden können. Es ist anders herum. Der Trick besteht darin, dass der Zyklus selbst und die Bedingungen für seinen Ausstieg nicht geändert werden können. Es gibt nur zwei Iterationen. Es gibt jedoch genug davon, um eine Endlosschleife zu erzeugen. Es sieht so aus, als ob es nur für zwei Iterationen funktionieren sollte, aber es kann durch Verwendung eines Überlaufs unendlich gemacht werden. Haben Sie schon erraten, wie?

Lösung

Wegen Überlauf. Integer.MAX_VALUEist der maximale Wert, der intin Java gespeichert werden kann. Wenn Sie diesen Wert erreichen Integer.MAX_VALUEund erhöhen, wird auf heruntergerollt Integer.MIN_VALUE, also auf den Mindestwert Integer. Um dieses Java-Problem zu lösen, müssen wir startder Variablen lediglich einen Wert zuweisen, der um 1 kleiner ist als der Maximalwert für den Datentyp int. Aufgabencode in Java:
class ToInfinity {
    public static void main(String[] args) {
        int start = Integer.MAX_VALUE - 1;
        for (int i = start; i <= start + 1; i++) {
            //бесконечный цикл
            System.out.println(i); //убеждаемся в бесконечности цикла
        }
    }
}
Was geschieht? Wir beginnen mit start=2147483645 (Integer.MAX_VALUE-1), bei der nächsten Iteration wird der Wert zu 2147483645, dann zu 2147483646, dann zu -2147483648, -2147483647 ... und so weiter.

Java-Aufgabe 2. Erstellen Sie einen Kommentar, der ausgeführt wird

Gut, da wären wir! Schon in den ersten Vorträgen hörten wir, dass Kommentare nicht ausgeführt werden. Deshalb sind es Kommentare. Wir glauben, dass die Lösung dieses Problems für einen Java-Programmierer, selbst für einen erfahrenen, nicht immer offensichtlich ist. Es gibt jedoch eine knifflige Möglichkeit, die Java-Maschine dazu zu zwingen, „legal“ einen Kommentar zur Ausführung auszuführen. Spüren Sie, woher der Wind weht? Versuchen zu erraten!

Lösung

Code zur Lösung des Problems in Java:
public class ExecutableComment {
    public static void main(String[] args) {
        // комментарий ниже будет выполнен!
        // \u000d System.out.println("выполняемый комментарий");
    }
}
Wenn wir den Code für diese Aufgabe in Java in der IDE eingeben, erhalten wir Folgendes:
выполняемый комментарий
Der Grund dafür ist, dass der Java-Compiler das Unicod-Zeichen \u000dals neue Zeile liest und unseren Code wie folgt liest: Der Compiler hat den Code zur Lösung des Problems in Java entschlüsselt:
public class ExecutableComment {
    public static void main(String[] args) {
        // the line below this gives an output
        // \u000d
        System.out.println("comment executed");
    }
}

Java-Aufgabe – 3: Erstellen Sie eine benannte Schleife

Ein weiterer Vertreter der Reihe „Praktische Programmierprobleme, Java im sphärischen Vakuum“. In dem Sinne, dass nicht klar ist, warum dies notwendig ist, ist es unwahrscheinlich, dass sich der Zyklus durch die Tatsache, dass er unpersönlich ist, beleidigt fühlt. Na gut, noch etwas ist wichtig: Die Sprache erlaubt es, dem Zyklus einen Namen zu geben.

Lösung

Hinweis: Für manche sind solche „Namen“ als „Tags“ bekannt, deren Verwendung in der Praxis jedoch nicht empfohlen wird. Code zur Lösung des Problems in Java, der eine benannte Schleife demonstriert
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);
            }
        }
    }
}
Dies ist die Ausgabe, 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
Hier können Sie auch continue verwenden, um zum Anfang einer benannten Schleife zu gelangen. Und bei Bedarf können Sie break(oder continue) in einer verschachtelten if-elsewith for-Schleife verwenden, um mehrere Schleifen mithilfe von zu unterbrechen if-else. Dadurch wird vermieden, dass viele Flags gesetzt und getestet werden müssen, if-elseum herauszufinden, ob die innere Schleife fortgesetzt oder verlassen werden soll.

Java-Problem – 4. Über das einzige Duplikat in einem Array von Ganzzahlen

Gegeben sei ein Array (oder ArrayList, wie Sie es bevorzugen) von Ganzzahlen, die Elemente Integervon 1 bis 100 enthalten. Dieses Array enthält ein und nur ein dupliziertes Element. Wie finde ich es? Solche Aufgaben sind einem Java-Programmierer vertrauter als die vorherigen drei. Denn es geht nicht darum, die Feinheiten der Sprache zu kennen, die fast nie verwendet werden, sondern um Logik. Der erste unbändige Drang, mit roher Gewalt zu lösen, verschwindet recht schnell, wenn sich der Kopf dreht oder die Einstellung „Ich bin Programmierer, ich bin schlau“ herrscht. Das einzig Schlimme ist, dass dies während eines Vorstellungsgesprächs unter Stress möglicherweise nicht passiert. Denken Sie also jetzt nach, bevor Sie sich mit der Lösung befassen!

Der Lösungsalgorithmus lautet wie folgt:

Berechnen Sie die Summe aller Zahlen von 1 bis 100. Wir glauben, dass Sie wissen, wie das geht (z. B. mit der berühmten Gauß-Methode). Berechnen Sie nun die Summe der Elemente Ihres Arrays oder ArrayList’а. Und... subtrahieren Sie den ersten Betrag vom zweiten. Bingo! Die resultierende Zahl ist der Wert des doppelten Elements. Java-Problemlösungscode für 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();
//находим сумму всех элементов списка
        int totalSum = elements.stream().mapToInt(e -> e).sum();
        System.out.println("Элемент, который повторяется : " + (totalSum - distinctSum));
    }

    public static void main(String[] args) {
//создаем список последовательных элементов на промежутке [1..101).
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
//устанавливаем элементу с индексом 53 Bedeutung 23
        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);
        }
        //добавляем дубликат в список
        numbers.add(25);
        Duplicate dn = new Duplicate();
        System.out.println("Элемент, который повторяется: " + dn.findDuplicateNumber(numbers));
    }
}

Java-Problem – 5. Über ein nicht eindeutiges Duplikat in einem Array von Ganzzahlen

Wenn Ihnen das vorherige Problem zu einfach erschien, versuchen Sie, das folgende zu lösen: Gegeben sei ein Blatt mit ganzen Zahlen von 1 bis 100. Es enthält Duplikate (mehr als eines). Wie finde ich Elemente, die mehr als einmal vorkommen (finden Sie das Element selbst und geben Sie an, wie oft es vorkommt)?

Lösung

Die logischste Lösung hierfür ist die Verwendung einer Struktur wie HashMap, da diese Daten in Schlüssel-Wert-Paaren speichert. Code zur Lösung des Java-Problems:
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 < >();
//заполняем Map duplicates значениями по принципу:
// ключ – Bedeutung Element, Bedeutung – сколько раз он встречается
        elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
//из duplicates убираем все элементы, которые встретoderсь не более 1 раза,
//и сохраняем //результат в список (для удобства обработки на следующем шаге)
        List <Map.Entry <Integer, Integer> >
        result = duplicates.entrySet().stream().filter(d -> d.getValue() > 1).collect(Collectors.toList());
//выводим результат для всех элементов в списке result
        result.forEach(e -> System.out.println(String.format("Элемент %d  встречается %d раз", 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);
    }
}

Abschluss

Praktische Java-Probleme sind sehr unterschiedlich und Sie wissen nicht, welche Art von unbekanntem Rätsel der Interviewer Ihnen stellen wird. Jeder adäquate Arbeitgeber weiß jedoch, dass Ihre Fähigkeit, echte praktische Probleme zu lösen , wie sie beispielsweise während Ihrer Arbeit auftreten, viel wichtiger ist als die Fähigkeit, knifflige Java-Probleme zu lösen . Lösen Sie sie also so oft wie möglich. Aus diesem Grund wurde JavaRush erstellt. Bei der Erstellung dieses Artikels wurden Materialien von geeksforgeeks verwendet.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION