613 Stimmen

Prüfen, ob mindestens zwei von drei Booleschen Werten wahr sind

Ein Interviewer hat mir kürzlich folgende Frage gestellt: Geben Sie bei drei booleschen Variablen a, b und c true zurück, wenn mindestens zwei der drei Variablen wahr sind.

Meine Lösung folgt:

boolean atLeastTwo(boolean a, boolean b, boolean c) {
    if ((a && b) || (b && c) || (a && c)) {
        return true;
    }
    else{
        return false;
    }
}

Er sagte, dass dies noch verbessert werden kann, aber wie?

173 Stimmen

Integrieren Sie die Return-Anweisung.

82 Stimmen

atLeastTwo(iWantYou, iNeedYou, imEverGonnaLoveYou)

1 Stimmen

Wäre es C gewesen, hätte man die Booleschen Werte einfach addieren können. Vielleicht war es das, woran er dachte, aber er vergaß, dass Java das nicht kann?

4voto

z-index Punkte 411

Wird über eine Wahrheitstabelle berechnet:

return (a & b) | (c & (a ^ b));

4voto

Barzee Punkte 776

Als Ergänzung zu dem ausgezeichneten Beitrag von @TofuBeer TofuBeer ist die Antwort von @pdox pdox zu beachten:

static boolean five(final boolean a, final boolean b, final boolean c)
{
    return a == b ? a : c;
}

Beachten Sie auch die disassemblierte Version, die Sie mit "javap -c" erhalten:

static boolean five(boolean, boolean, boolean);
  Code:
    0:    iload_0
    1:    iload_1
    2:    if_icmpne    9
    5:    iload_0
    6:    goto    10
    9:    iload_2
   10:    ireturn

Die Antwort von pdox kompiliert zu weniger Bytecode als alle anderen Antworten. Wie sieht die Ausführungszeit im Vergleich zu den anderen aus?

one                5242 ms
two                6318 ms
three (moonshadow) 3806 ms
four               7192 ms
five  (pdox)       3650 ms

Zumindest auf meinem Computer ist die Antwort von pdox nur geringfügig schneller als die von @moonshadow moonshadow, so dass die Antwort von pdox die schnellste insgesamt ist (auf meinem HP/Intel-Laptop).

4voto

coder Punkte 51

Mit Java 8 würde ich so etwas wirklich bevorzugen:

boolean atLeastTwo(boolean a, boolean b, boolean c) {
    return Stream.of(a, b, c).filter(active -> active).count() >= 2;
}

4voto

abelito Punkte 1054

Der einfachste Weg (IMO), der nicht verwirrend und leicht zu lesen ist:

// Three booleans, check if two or more are true

return ( a && ( b || c ) ) || ( b && c );

4voto

Kevin Punkte 12909
return 1 << $a << $b << $c >= 1 << 2;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X