【问题标题】:Check if at least two out of three booleans are true检查三个布尔值中的至少两个是否为真
【发布时间】:2011-03-05 19:13:26
【问题描述】:

一位面试官最近问我这个问题:给定三个布尔变量 a、b 和 c,如果三个中至少有两个为真,则返回真。

我的解决方案如下:

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

他说这可以进一步改进,但是如何呢?

【问题讨论】:

  • 内联return语句。
  • atLeastTwo(iWantYou, iNeedYou, imEverGonnaLoveYou)
  • Thorbjørn:C 不使用零/非零作为布尔值吗?我认为这甚至在 C 中也行不通,例如 atLeastTwo(0,2,0)
  • 为什么人们会赞成最琐碎的问题?
  • 通俗易懂的问题获得了很多赞成票。非常具体和技术性的问题不会。

标签: java boolean boolean-logic


【解决方案1】:
public static boolean atLeast(int atLeastToBeTrue, boolean...bools){
    int booleansTrue = 0;
    for(boolean tmp : bools){
        booleansTrue += tmp ? 1 : 0;
    }
    return booleansTrue >= atLeastToBeTrue;
}

您可以从varargs 又名boolean[] 中选择您想要多少个at least :-)

【讨论】:

    【解决方案2】:

    目前使用 Java 8,我真的更喜欢这样的东西:

    boolean atLeastTwo(boolean a, boolean b, boolean c) {
        return Stream.of(a, b, c).filter(active -> active).count() >= 2;
    }
    

    【讨论】:

    • 你可以用Arrays.asList(a, b, c).stream()代替Stream.of(a, b, c)...
    • 非常重量级。
    • @Boan 我认为代码揭示意图比早期优化更重要...
    【解决方案3】:

    另一个:

    return a? b||c : b&&c
    

    【讨论】:

    • 接受答案的另一个副本?最好先检查一下您的答案是否已被其他人发布。
    【解决方案4】:

    这在算术运算的帮助下非常简单。

    boolean a = true;
    boolean b = false;
    boolean c = true;
    
    
    // Exactly One boolean value true.
    if((a?1:0)+(b?1:0)+(c?1:0)==1) 
       return true;
    else
       return false;
    
    // Exactly 2 boolean value true.
    if((a?1:0)+(b?1:0)+(c?1:0)==2) 
       return true;
    else
       return false;
    

    这就是你如何增加常量的值来检查有多少布尔值true

    【讨论】:

      【解决方案5】:

      如果你有很多布尔值,那么运算符重载很容易。

      operator fun Boolean.unaryPlus() = if (this) 1 else 0
      // ...
      if(+bool1 + +bool2 + ... + +boolN > 2) {
          // ...
      }
      

      【讨论】:

        猜你喜欢
        • 2019-05-22
        • 2021-11-14
        • 1970-01-01
        • 2015-09-22
        • 2012-10-27
        • 2017-10-06
        • 2016-09-19
        • 1970-01-01
        • 2013-09-18
        相关资源
        最近更新 更多