Logik & Informatik-Grundlagen
Boolesche Ausdrücke, Big-O, Bit-Operationen, Regex, SQL. Geprüft per Wahrheitstabelle, Schleifenzählung, OpenJDK 21 und SQLite.
- De Morgan ★☆☆ Boolesche Logik ✓ gelöst
Ausdruck: !(a && b)
Welcher Ausdruck ist gleichwertig?
Lösung anzeigen
Richtig: !a || !b
Regel von De Morgan: Die Negation eines UND wird zum ODER der Negationen. „Nicht beide“ heißt „mindestens einer nicht“. Häufiger Fehler beim Umschreiben von if-Bedingungen: !a && !b, das wäre „keiner von beiden“.
- Vereinfachen ★★☆ Boolesche Logik ✓ gelöst
Ausdruck: (a && b) || (a && !b)
Worauf lässt sich der Ausdruck vereinfachen?
Lösung anzeigen
Richtig: a
a ausklammern: a && (b || !b). Da b || !b immer wahr ist, bleibt a. In echtem Code findet man so überflüssige Prüfungen, die nur die Lesbarkeit verschlechtern.
- Absorption ★★☆ Boolesche Logik ✓ gelöst
Ausdruck: a || (a && b)
Welcher Ausdruck ist gleichwertig?
Lösung anzeigen
Richtig: a
Absorptionsgesetz: Ist a wahr, ist das Ganze wahr. Ist a falsch, ist auch a && b falsch. Das Ergebnis hängt also nur von a ab, b ist bedeutungslos.
- Wahrheitstabelle zählen ★★☆ Boolesche Logik ✓ gelöst
Ausdruck: (a || b) && !c
In wie vielen der 8 Zeilen der Wahrheitstabelle ist der Ausdruck wahr?
Lösung anzeigen
Richtig: 3
!c halbiert auf 4 Zeilen (c = falsch). Davon ist a || b in 3 Fällen wahr, nur a = b = falsch fällt weg. Ergebnis 3.
- Zwei volle Schleifen ★☆☆ Komplexität · Big-O ✓ gelöst
Code:
for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { count++; } }Welche Laufzeitkomplexität hat der Code in Abhängigkeit von n?
Lösung anzeigen
Richtig: O(n²)
Die innere Schleife läuft n-mal für jedes der n i. Insgesamt n · n Durchläufe. Doppelt so viele Daten bedeuten viermal so viel Arbeit.
- Verdoppeln ★★☆ Komplexität · Big-O ✓ gelöst
Code:
for (int i = 1; i < n; i *= 2) { count++; }Welche Laufzeitkomplexität hat der Code in Abhängigkeit von n?
Lösung anzeigen
Richtig: O(log n)
i verdoppelt sich in jedem Schritt: 1, 2, 4, 8 … Bis n erreicht ist, braucht es etwa log₂(n) Schritte. Bei einer Million sind das nur 20 Durchläufe. Genau so arbeitet die Binärsuche.
- Dreieck-Schleife ★★☆ Komplexität · Big-O ✓ gelöst
Code:
for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { count++; } }Welche Laufzeitkomplexität hat der Code in Abhängigkeit von n?
Lösung anzeigen
Richtig: O(n²)
Die innere Schleife wird zwar immer länger, insgesamt sind es aber 0 + 1 + 2 + … + (n - 1) = n(n - 1)/2 Durchläufe. Konstante Faktoren wie ½ fallen bei Big-O weg, es bleibt O(n²). Der Code ist doppelt so schnell wie zwei volle Schleifen, wächst aber gleich.
- Schleife mal Verdoppeln ★★★ Komplexität · Big-O ✓ gelöst
Code:
for (int i = 0; i < n; i++) { for (int j = 1; j < n; j *= 2) { count++; } }Welche Laufzeitkomplexität hat der Code in Abhängigkeit von n?
Lösung anzeigen
Richtig: O(n log n)
Außen n Durchläufe, innen jeweils log n. Zusammen n · log n. Das ist die Größenordnung guter Sortierverfahren wie Mergesort.
- XOR ★☆☆ Bit-Operationen ✓ gelöst
Java-Ausdruck: 5 ^ 3
Welchen Wert hat der Ausdruck?
Lösung anzeigen
Richtig: 6
^ ist in Java kein Potenzieren, sondern bitweises XOR. 101 XOR 011 = 110, also 6. Wer 125 erwartet, hat einen klassischen Denkfehler, der auch im echten Code vorkommt. Potenzen gehen mit Math.pow.
- Vorzeichenloses Schieben ★★★ Bit-Operationen ✓ gelöst
Java-Ausdruck: -1 >>> 28
Welchen Wert hat der Ausdruck?
Lösung anzeigen
Richtig: 15
-1 besteht aus 32 Einsen. >>> schiebt nach rechts und füllt mit Nullen auf. Nach 28 Stellen bleiben 4 Einsen übrig: 1111 = 15. Mit >> (mit Vorzeichen) bliebe es -1.
- Links schieben ★★☆ Bit-Operationen · Überlauf ✓ gelöst
Java-Ausdruck: 1 << 31
Welchen Wert hat der Ausdruck?
Lösung anzeigen
Richtig: -2147483648
Die 1 landet im höchsten Bit, und das ist bei int das Vorzeichenbit. Ergebnis ist Integer.MIN_VALUE. 2147483648 passt nicht in einen int.
- Bit-Trick ★★★ Bit-Operationen ✓ gelöst
Java-Ausdruck für n > 0: (n & (n - 1)) == 0
Was prüft dieser Ausdruck?
Lösung anzeigen
Richtig: Ob n eine Zweierpotenz ist
Eine Zweierpotenz hat genau ein gesetztes Bit, z. B. 8 = 1000. n - 1 = 0111 hat genau die anderen Bits. Das UND ergibt 0. Bei allen anderen Zahlen bleibt das höchste Bit stehen. Geprüft für alle n von 1 bis 4999.
- Telefon-Muster ★☆☆ Regex ✓ gelöst
Regulärer Ausdruck: \d{3}-\d{4} Geprüft wird mit matches(), also die gesamte Zeichenkette.
Welche Zeichenkette passt?
Lösung anzeigen
Richtig: 123-4567
\d steht für eine Ziffer, {3} für genau drei Wiederholungen. Gefordert sind also exakt drei Ziffern, ein Bindestrich, vier Ziffern. Das Leerzeichen passt nicht auf den Bindestrich.
- Großer Anfangsbuchstabe ★★☆ Regex ✓ gelöst
Regulärer Ausdruck: [A-Z][a-z]+ Geprüft wird mit matches(), also die gesamte Zeichenkette.
Welche Zeichenkette passt?
Lösung anzeigen
Richtig: Hallo
Ein Großbuchstabe, danach mindestens ein Kleinbuchstabe (+ heißt einmal oder öfter). „H“ scheitert am +, „HALLO“ an den großen Folgebuchstaben. Achtung: Umlaute wie „Ärger“ würden auch nicht passen, [A-Z] kennt nur A bis Z.
- Punkt maskieren ★★☆ Regex ✓ gelöst
Regulärer Ausdruck: .*\.java Geprüft wird mit matches(), also die gesamte Zeichenkette.
Welche Zeichenkette passt?
Lösung anzeigen
Richtig: Main.java
\. ist ein echter Punkt, .* davor beliebige Zeichen. „Mainjava“ hat keinen Punkt, „Main.javax“ hört nicht auf .java auf (matches prüft die ganze Zeichenkette), „Main.JAVA“ scheitert an der Groß-/Kleinschreibung.
- Gierige Quantoren ★★★ Regex ✓ gelöst
Regulärer Ausdruck: <.+> Text: <b>fett</b>
Was liefert der erste Treffer von find()?
Lösung anzeigen
Richtig: <b>fett</b>
+ ist gierig: Es nimmt so viel wie möglich und gibt nur so weit nach, wie nötig. Vom ersten < bis zum letzten > passt alles. Für den kleinsten Treffer „<b>“ braucht man den genügsamen Quantor +? (also <.+?>).
- COUNT und NULL ★☆☆ SQL · NULL ✓ gelöst
Tabelle kunde: id | name | email | status | bonus 1 | Anna | anna@x.de | aktiv | 100 2 | Ben | NULL | inaktiv | NULL 3 | Clara | clara@x.de | NULL | 200 4 | David | NULL | gesperrt | NULL 5 | Eva | eva@x.de | aktiv | NULL Abfrage: SELECT COUNT(*), COUNT(email) FROM kunde;
Was liefert die Abfrage?
Lösung anzeigen
Richtig: 5 und 3
COUNT(*) zählt Zeilen, COUNT(spalte) nur Zeilen, in denen die Spalte nicht NULL ist. Zwei Kunden haben keine E-Mail, also 5 und 3.
- Ungleich und NULL ★★★ SQL · NULL ✓ gelöst
Tabelle kunde: id | name | email | status | bonus 1 | Anna | anna@x.de | aktiv | 100 2 | Ben | NULL | inaktiv | NULL 3 | Clara | clara@x.de | NULL | 200 4 | David | NULL | gesperrt | NULL 5 | Eva | eva@x.de | aktiv | NULL Abfrage: SELECT * FROM kunde WHERE status <> 'aktiv';
Wie viele Zeilen liefert die Abfrage?
Lösung anzeigen
Richtig: 2
Ben (inaktiv) und David (gesperrt). Clara fehlt: NULL <> 'aktiv' ist nicht wahr, sondern UNKNOWN, und WHERE lässt nur wahre Zeilen durch. Wer auch Clara will, braucht OR status IS NULL. Einer der häufigsten SQL-Fehler.
- Durchschnitt mit NULL ★★☆ SQL · NULL · Aggregation ✓ gelöst
Tabelle kunde: id | name | email | status | bonus 1 | Anna | anna@x.de | aktiv | 100 2 | Ben | NULL | inaktiv | NULL 3 | Clara | clara@x.de | NULL | 200 4 | David | NULL | gesperrt | NULL 5 | Eva | eva@x.de | aktiv | NULL Abfrage: SELECT AVG(bonus) FROM kunde;
Was liefert die Abfrage?
Lösung anzeigen
Richtig: 150
AVG ignoriert NULL-Werte: (100 + 200) / 2 = 150, nicht (100 + 200) / 5 = 60. Sollen fehlende Boni als 0 zählen, braucht man AVG(COALESCE(bonus, 0)). Fachlich muss man klären, was gemeint ist.
- LEFT JOIN zählen ★★☆ SQL · JOIN ✓ gelöst
Tabelle kunde: id | name | email | status | bonus 1 | Anna | anna@x.de | aktiv | 100 2 | Ben | NULL | inaktiv | NULL 3 | Clara | clara@x.de | NULL | 200 4 | David | NULL | gesperrt | NULL 5 | Eva | eva@x.de | aktiv | NULL Tabelle bestellung: id | kunde_id 1 | 1 2 | 1 3 | 3 Abfrage: SELECT k.name, b.id FROM kunde k LEFT JOIN bestellung b ON b.kunde_id = k.id;
Wie viele Zeilen liefert die Abfrage?
Lösung anzeigen
Richtig: 6
LEFT JOIN behält alle Kunden. Anna erscheint zweimal (zwei Bestellungen), Clara einmal, Ben, David und Eva je einmal mit NULL als Bestellung. 2 + 1 + 3 = 6. Ein INNER JOIN lieferte nur 3 Zeilen.