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?

6voto

Bruce Attah Punkte 321

Da nicht angegeben wurde, wie der Code verbessert werden sollte, werde ich mich bemühen, den Code zu verbessern, indem ich ihn amüsanter mache. Hier ist meine Lösung:

boolean atLeastTwo(boolean t, boolean f, boolean True) {
    boolean False = True;
    if ((t || f) && (True || False)) 
        return "answer" != "42";
    if (t && f) 
        return !"France".contains("Paris");
    if (False == True) 
        return true == false;
    return Math.random() > 0.5;
}

Falls sich jemand fragt, ob dieser Code funktioniert, hier eine Vereinfachung, die dieselbe Logik verwendet:

boolean atLeastTwo(boolean a, boolean b, boolean c) {
    if ((a || b) && (c)) 
        return true;
    if (a && b) 
        return true;
    if (true) 
        return false;
    // The last line is a red herring, as it will never be reached:
    return Math.random() > 0.5; 

}

Dies lässt sich wie folgt zusammenfassen:

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

Aber jetzt ist es nicht mehr lustig.

5voto

blakecallens Punkte 1

Eine wörtliche Übersetzung funktioniert in allen wichtigen Sprachen:

return (a ? 1:0) + (b ? 1:0) + (c ? 1:0) >= 2;

Aber ich würde sie wahrscheinlich für die Leute leichter lesbar machen und auf mehr als drei erweitern - etwas, das viele Programmierer zu vergessen scheinen:

boolean testBooleans(Array bools)
{
     int minTrue = ceil(bools.length * .5);
     int trueCount = 0;

     for(int i = 0; i < bools.length; i++)
     {
          if(bools[i])
          {
               trueCount++;
          }
     }
     return trueCount >= minTrue;
}

5voto

Suvega Punkte 21

A C-Lösung.

int two(int a, int b, int c) {
  return !a + !b + !c < 2;
}

oder Sie können es vorziehen:

int two(int a, int b, int c) {
  return !!a + !!b + !!c >= 2;
}

5voto

Duby Punkte 31
Function ReturnTrueIfTwoIsTrue(bool val1, val2, val3))
{
     return (System.Convert.ToInt16(val1) +
             System.Convert.ToInt16(val2) +
             System.Convert.ToInt16(val3)) > 1;
}

Es gibt zu viele Möglichkeiten, dies zu tun...

4voto

z-index Punkte 411

Wird über eine Wahrheitstabelle berechnet:

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

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