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

Kintar Punkte 36

Das ist definitiv eine Frage, bei der es mehr darum geht, wie Sie Probleme lösen/denken, als um Ihre tatsächlichen Programmierfähigkeiten.

Eine etwas kürzere Version könnte lauten

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

Aber wie ein Vorposter schon sagte, wenn ich das in irgendeinem Code sehen würde, an dem ich arbeite, würde sich jemand ein Ohr abschneiden :)

2voto

this. __curious_geek Punkte 41801

Ich habe diese Lösung gefunden.

boolean atLeastTwo(boolean a, boolean b, boolean c) {
    bool result = !(a ^ b ^ c) && !(!a & !b & !c) || (a & b & c);
    return result;
}

2voto

Aaron Punkte 9

Unter C# und zwar aus dem Stegreif:

public bool lol(int minTrue, params bool[] bools)
{
    return bools.Count( ( b ) => b ) >= minTrue;
}

sollte ziemlich schnell gehen.

Ein Anruf würde folgendermaßen aussehen:

lol( 2, true, true, false );

Auf diese Weise überlassen Sie die Regeln (zwei müssen wahr sein) dem Aufrufer, anstatt sie in die Methode einzubetten.

2voto

supercat Punkte 72939

Wenn das Ziel darin besteht, einen bitweisen Zwei-aus-Drei-Wert für drei Operanden zurückzugeben, sind arithmetische und iterative Ansätze relativ ineffektiv. Auf vielen CPU-Architekturen wäre eine gute Form "return ((a | b) & c) | (a & b);". Das erfordert vier boolesche Operationen. Bei Maschinen mit einem Akkumulator (wie sie in kleinen eingebetteten Systemen üblich sind) sind dafür insgesamt sieben Anweisungen pro Byte erforderlich. Die Form "return (a & b) | (a & c) | (b & c);" sieht vielleicht schöner aus, erfordert aber fünf boolesche Operationen bzw. neun Anweisungen pro Byte auf einer Maschine mit einem Akkumulator.

In der CMOS-Logik sind für die Berechnung von "nicht zwei aus drei" übrigens zwölf Transistoren erforderlich (zum Vergleich: ein Inverter benötigt zwei, ein NAND oder NOR mit zwei Eingängen vier und ein NAND oder NOR mit drei Eingängen sechs).

1voto

Kshitij Banerjee Punkte 1548

Wenn ich die Booleschen Werte in eine Zahl umwandle und die Zahl keine Zweierpotenz ist, hat sie mindestens zwei Wahrheiten.

a*4 + b*2 + c*1 = N
return( N != 0 && (N&(N-1)) != 0)

Ich biete nur eine Alternative an.

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