Проверьте, верно ли хотя бы два из трех логических значений - PullRequest
568 голосов
/ 19 июня 2010

Один из интервьюеров недавно задал мне этот вопрос: при наличии трех логических переменных a, b и c верните true, если хотя бы две из трех верны.

Мое решение следующее:

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

Он сказал, что это можно еще улучшить, но как?

Ответы [ 63 ]

1 голос
/ 16 декабря 2014

Используя другой подход к этому, используя функциональность Java 8 Stream , для любого числа логических значений с произвольным необходимым количеством.Поток короткого замыкания, если он достигает предела перед обработкой всех элементов:

public static boolean atLeastTrue(int amount, Boolean ... booleans) {
    return Stream.of(booleans).filter(b -> b).limit(amount).count() == amount;
}

public static void main(String[] args){
    System.out.println("1,2: " + atLeastTrue(1, true, false, true));
    System.out.println("1,1: " + atLeastTrue(1, false, true));
    System.out.println("1,0: " + atLeastTrue(1, false));
    System.out.println("1,1: " + atLeastTrue(1, true, false));
    System.out.println("2,3: " + atLeastTrue(2, true, false, true, true));
    System.out.println("3,2: " + atLeastTrue(3, true, false, true, false));
    System.out.println("3,3: " + atLeastTrue(3, true, true, true, false));
}

Выход:

1,2: true
1,1: true
1,0: false
1,1: true
2,3: true
3,2: false
3,3: true
1 голос
/ 20 апреля 2012

Как насчет этого:

(a - b) ? c : a
1 голос
/ 04 августа 2010

C:

if (!!a + !!b + !!c >= 2)
0 голосов
/ 08 февраля 2015
public static boolean atLeast(int atLeastToBeTrue, boolean...bools){
    int booleansTrue = 0;
    for(boolean tmp : bools){
        booleansTrue += tmp ? 1 : 0;
    }
    return booleansTrue >= atLeastToBeTrue;
}

Вы можете выбрать, сколько at least вы хотите быть правдой из varargs aka boolean[]: -)

0 голосов
/ 23 апреля 2013

Я думаю, что самое простое решение:

return (a && b) ||с;

0 голосов
/ 27 марта 2012

Функция ko возвращает ответ:

static int ho(bool a)
{
    return a ? 1 : 0;
}

static bool ko(bool a, bool b, bool c)
{
    return ho(a) + ho(b) + ho(c) >= 2 ? true : false;
}
0 голосов
/ 18 января 2011

Мне кажется, что три из трех - совершенно произвольные числа, и функция должна работать с произвольным числом. Таким образом, чтобы ответить на вопрос, я бы написал функцию, которая работала бы, если бы х в массиве были истинными, например,

bool istrue ( int x, bool[] list)
    y = count true in list
    return y >= x
0 голосов
/ 30 января 2012

Если я преобразую логическое значение в число, и если число не является степенью двойки, оно имеет как минимум два истинных значения.

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

Я просто даю альтернативу.

0 голосов
/ 21 июня 2010
function atLeastTwoTrue($a, $b, $c) {

  int count = 0;
  count = (a ? count + 1 : count);
  count = (b ? count + 1 : count);
  count = (c ? count + 1 : count);
  return (count >= 2);
}
0 голосов
/ 22 июня 2010

Моя первая мысль была

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

но для простоты чтения мне понравилось предложенное решение a + b + c> = 2, которое вы, ребята, предложили лучше

...