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?

145voto

danatel Punkte 4674

Die Lesbarkeit sollte das Ziel sein. Jemand, der den Code liest, muss Ihre Absicht sofort verstehen. Hier ist also meine Lösung.

int howManyBooleansAreTrue =
      (a ? 1 : 0)
    + (b ? 1 : 0)
    + (c ? 1 : 0);

return howManyBooleansAreTrue >= 2;

34voto

moonshadow Punkte 81155

Sie brauchen die Kurzschlussformen der Operatoren nicht zu verwenden.

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

Diese führt die gleiche Anzahl von logischen Operationen aus wie Ihre Version, ist jedoch völlig verzweigungslos.

30voto

Carl Manaster Punkte 38966

Hier ist ein allgemeiner, testbasierter Ansatz. Nicht so "effizient" wie die meisten der bisher angebotenen Lösungen, aber klar, getestet, funktionierend und verallgemeinert.

public class CountBooleansTest extends TestCase {
    public void testThreeFalse() throws Exception {
        assertFalse(atLeastTwoOutOfThree(false, false, false));
    }

    public void testThreeTrue() throws Exception {
        assertTrue(atLeastTwoOutOfThree(true, true, true));
    }

    public void testOnes() throws Exception {
        assertFalse(atLeastTwoOutOfThree(true, false, false));
        assertFalse(atLeastTwoOutOfThree(false, true, false));
        assertFalse(atLeastTwoOutOfThree(false, false, true));
    }

    public void testTwos() throws Exception {
        assertTrue(atLeastTwoOutOfThree(false, true, true));
        assertTrue(atLeastTwoOutOfThree(true, false, true));
        assertTrue(atLeastTwoOutOfThree(true, true, false));
    }

    private static boolean atLeastTwoOutOfThree(boolean b, boolean c, boolean d) {
        return countBooleans(b, c, d) >= 2;
    }

    private static int countBooleans(boolean... bs) {
        int count = 0;
        for (boolean b : bs)
            if (b)
                count++;
        return count;
    }
}

24voto

memet Punkte 73

Zusammengefasst. Sie heißt nicht umsonst boolesche Algebra:

  0 x 0 = 0
  1 x 0 = 0
  1 x 1 = 1

  0 + 0 = 0
  1 + 0 = 1
  1 + 1 = 0 (+ carry)

Wenn Sie sich die dortigen Wahrheitstabellen ansehen, sehen Sie, dass die Multiplikation ein boolesches und ist, und die einfache Addition ein xor.

Um Ihre Frage zu beantworten:

return (a + b + c) >= 2

15voto

malu Punkte 61
boolean atLeastTwo(boolean a, boolean b, boolean c) 
{
  return ((a && b) || (b && c) || (a && c));
}

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