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?

12voto

TofuBeer Punkte 59410

Die offensichtlichste Reihe von Verbesserungen sind:

// There is no point in an else if you already returned.
boolean atLeastTwo(boolean a, boolean b, boolean c) {
    if ((a && b) || (b && c) || (a && c)) {
        return true;
    }
    return false;
}

und dann

// There is no point in an if(true) return true otherwise return false.
boolean atLeastTwo(boolean a, boolean b, boolean c) {
    return ((a && b) || (b && c) || (a && c));
}

Aber diese Verbesserungen sind geringfügig.

9voto

Roman A. Taycher Punkte 17289

Ich mag keine ternären ( return a ? (b || c) : (b && c); aus der obersten Antwort), und ich glaube nicht, dass ich gesehen habe, dass es jemand erwähnt hat. Es ist wie folgt geschrieben:

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

8voto

Vagif Verdi Punkte 4708

Unter Clojure :

(defn at-least [n & bools]
  (>= (count (filter true? bools)) n)

Verwendung:

(at-least 2 true false true)

7voto

Joe Enos Punkte 38081

Ich glaube, ich habe diese Lösung noch nicht gesehen:

boolean atLeast(int howMany, boolean[] boolValues) {
  // check params for valid values

  int counter = 0;
  for (boolean b : boolValues) {
    if (b) {
      counter++;

      if (counter == howMany) {
        return true;
      }
    }
  }
  return false;
}

Ihr Vorteil ist, dass sie abbricht, sobald sie die gesuchte Zahl erreicht hat. Wenn also "mindestens 2 von diesen 1.000.000 Werten wahr sind", wobei die ersten beiden tatsächlich wahr sind, dann sollte es schneller gehen als einige der "normalen" Lösungen.

7voto

vine'th Punkte 4708

Wir können die bools in ganze Zahlen umwandeln und diese einfache Prüfung durchführen:

(int(a) + int(b) + int(c)) >= 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