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?

2voto

SirensOfTitan Punkte 779

Die nicht reduzierte Lösung für dieses Problem lautet:

a'bc + abc' + abc + ab'c

Durch die Verwendung von K-Maps erhält man eine Reduktion:

bc + ab + ac

Man könnte dies noch weiter reduzieren, indem man ausschließende oder auf den a'bc- und abc'-Zwischenwörtern verwendet und die abc- und ab'c-Zwischenwörter kombiniert:

b(a ^ c) + ac

2voto

Egalitarian Punkte 2048

Die drei booleschen Werte seien A, B und C....

Sie können eine k-MAP verwenden und mit einem booleschen Ausdruck kommen ...

In diesem Fall wird der boolesche Ausdruck A(B+C) + C

oder if((A && (B || C )) || C ) { true zurückgeben; } sonst false zurückgeben;

2voto

CurtainDog Punkte 3116

Die 2 und die 3 in der gestellten Frage sind eindeutig magische Zahlen. Die "richtige" Antwort wird davon abhängen, ob der Interviewer versucht hat, Ihr Verständnis für boolesche Logik (und ich glaube nicht, dass die Antwort von pdox in dieser Hinsicht übertroffen werden kann) oder Ihr Verständnis für architektonische Fragen zu ermitteln.

Ich wäre geneigt, eine Map-Reduce-Lösung zu verwenden, die jede Art von Liste mit jeder beliebigen Bedingung akzeptiert.

2voto

endy Punkte 3852
int count=0;

boolean atLeastTwo(boolean a, boolean b, boolean c) {
    if (a)
        count++;
    if (b)
        count++;
    if (c)
        count++;

    if (count>1)
        return true;
    else
        return false;
}

2voto

ZaBlanc Punkte 4661

Die beste Antwort auf die Frage sollte lauten: "Als Angestellter ist es wichtig, dass ich es so schreibe, dass meine Bedeutung klar ist und gleichzeitig die Effizienz gewahrt bleibt, wo es für die Leistung notwendig ist." So würde ich es formulieren:

function atLeastTwoAreTrue(a, b, c) {
    return (a && b) || (b && c) || (a && c);
}

In Wirklichkeit ist der Test so ausgeklügelt, dass es vollkommen akzeptabel ist, eine möglichst schnelle, kryptische Methode zu schreiben, wenn man sie mit einem einfachen Kommentar versieht. Aber im Allgemeinen brauchen wir in dieser Ein-Zeilen-Welt mehr lesbaren Code :-)

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