检查三个布尔值中至少有两个为真

612

最近面试官问了我这个问题:给定三个布尔型变量a、b和c,如果其中至少有两个是true,则返回true。

我的解决方案如下:

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

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


173
将返回语句内联。 - Finglas
82
atLeastTwo(iWantYou, iNeedYou, imEverGonnaLoveYou) - Andrew Grimm
6
Thorbjørn 问道:C语言中是否使用0/非0来表示布尔值?我认为这种情况在C语言中不适用,例如atLeastTwo(0,2,0)。请问您的看法? - Ken
93
为什么人们会给那些最琐碎的问题点赞? - BlueRaja - Danny Pflughoeft
52
通俗易懂的问题会得到很多赞,而过于具体和技术性的问题则不会。 - Jay
显示剩余14条评论
65个回答

0

如果你有很多布尔值,使用运算符重载会很容易。

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

-1
另一个:
return a? b||c : b&&c

1
已经有一个被接受的答案的副本了吗?首先检查一下是否已经有其他人发布了你的答案总是一个好主意。 - Kal

-4

我认为使用简单的布尔运算符 (a || b) && (b || c) 是可以的,而且更简单。

你可以将这三个字母中的任意一个与其他两个中的任意一个交换,它仍然是相同的表达式。


除非这个答案是错误的,否则它将返回 true,仅当 b 是 true 时。 - Kevin
你说得对。那我就坚持使用 a+b+c>=2 吧。这个方法也适用于 PHP 和 Python。 - gnrfan

-6
我认为最简单的解决方案是:
返回 (a && b) || c;

这只检查a和b是否都为真或c是否为真。 - Luka

-7

我的第一个想法是

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

但是为了阅读方便,我更喜欢你们提出的a+b+c>=2的解决方案


7
当a和c为false,只有b为true时,你的答案返回了一个错误的值。 - Timothy Fries

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接