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?

3voto

Jay Punkte 26044

Mein erster Gedanke, als ich die Frage sah, war:

int count=0;
if (a)
    ++count;
if (b)
    ++count;
if (c)
    ++count;
return count>=2;

Nachdem ich andere Beiträge gesehen habe, muss ich zugeben, dass

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

ist viel eleganter. Ich frage mich, wie die relativen Laufzeiten sind.

Auf jeden Fall halte ich diese Art von Lösung für viel besser als eine Lösung der

return a&b | b&c | a&c;

Sorte, weil sie leichter erweiterbar ist. Was ist, wenn wir später eine vierte Variable hinzufügen, die getestet werden muss? Was ist, wenn die Anzahl der Variablen zur Laufzeit bestimmt wird und uns ein Array von Booleschen Variablen unbekannter Größe übergeben wird? Eine Lösung, die auf dem Zählen beruht, ist viel einfacher zu erweitern als eine Lösung, die auf der Auflistung aller möglichen Kombinationen beruht. Außerdem vermute ich, dass es bei der Auflistung aller möglichen Kombinationen viel einfacher ist, einen Fehler zu machen. Versuchen Sie z. B., den Code für "beliebige 3 aus 4" zu schreiben, und stellen Sie sicher, dass Sie keine übersehen oder duplizieren. Versuchen Sie es jetzt mit "jede 5 von 7".

2voto

Kate Gregory Punkte 18638

Ich habe noch nicht gesehen, dass andere darauf hingewiesen haben, dass es zum Standard gehört, im Abschnitt "Bitte schreiben Sie mir etwas Code" des Vorstellungsgesprächs zu sagen: "Könnten Sie das verbessern?" oder "Sind Sie damit völlig zufrieden?" oder "Ist das so optimal wie möglich? Möglicherweise haben Sie "wie würden Sie das verbessern" als "das könnte verbessert werden; wie?" verstanden. In diesem Fall würde eine Änderung der if(x) return true; else return false; Idiom zu einfach return x ist eine Verbesserung - aber seien Sie sich bewusst, dass sie manchmal nur sehen wollen, wie Sie auf die Frage reagieren. Ich habe gehört, dass manche Gesprächspartner darauf bestehen, dass es einen Fehler im perfekten Code gibt, nur um zu sehen, wie Sie damit umgehen.

2voto

teodozjan Punkte 872

Nicht im Zusammenhang mit der Leistung, sondern mit gutem Code (erweiterbarer und lesbarer Code, der wiederverwendet werden kann)

     static boolean trueBooleans (int howMany,boolean ... bools)
     {
      int total = 0;

      for (boolean b:bools)
        if (b && (++total == howMany)) return true;

      return false;
    }

Meiner bescheidenen Meinung nach sind beim Schreiben von Java der einfache Umgang mit unerwarteten Änderungen und das Vermeiden von doppeltem Code wichtiger als prägnante (Domäne von Skriptsprachen) oder schnelle Programme.

2voto

labratmatt Punkte 1791

Ternäre Operatoren bringen die Nerdsäfte zum Fließen, aber sie können verwirrend sein (was den Code weniger wartbar macht und somit das Potenzial für Bug-Injection erhöht). Jeff Attwood es gut gesagt aquí :

Das ist ein perfektes Beispiel einer völlig bedeutungslosen einmaligen Schreibzeitersparnis gegen Dutzende von Einbußen bei der Lesezeit - es bringt mich zum Nachdenken.

Um ternäre Operatoren zu vermeiden, habe ich die folgende Funktion erstellt:

function atLeastTwoTrue($a, $b, $c) {
        $count = 0;

        if ($a) { $count++; }
        if ($b) { $count++; }
        if ($c) { $count++; }

        if ($count >= 2) {
                return true;
        } else {
                return false;
        }
}

Ist sie so cool wie einige der anderen Lösungen? Nein. Ist sie einfacher zu verstehen? Ja. Wird das zu besser wartbarem, weniger fehleranfälligem Code führen? Ja.

2voto

d1val Punkte 371

Wie wäre es mit (a||b) && (a||c) - Java verwendet drei Vergleiche anstelle der sechs, die der Auftraggeber angibt.

Falsch, ich hätte vorher nachsehen sollen.

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