最近面试官问了我这个问题:给定三个布尔型变量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;
}
}
他说这还可以进一步改善,但如何呢?
最近面试官问了我这个问题:给定三个布尔型变量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;
}
}
他说这还可以进一步改善,但如何呢?
这种阅读体验更佳:
if (a) {
return b || c;
}
else {
return b && c;
}
int count=0;
if (a)
++count;
if (b)
++count;
if (c)
++count;
return count>=2;
看到其他帖子后,我承认
return (a?1:0)+(b?1:0)+(c?1:0)>=2;
这种方法更加优雅。我想知道相对运行时间是多少。
无论如何,我认为这种解决方案要比其他解决方案好得多。
return a&b | b&c | a&c;
使用变量的数量可以更容易地扩展。如果以后我们添加了第四个必须测试的变量怎么办?如果变量的数量在运行时确定,并且我们传递了一个大小未知的布尔数组怎么办?依赖计数的解决方案比依赖列出每种可能组合的解决方案更容易扩展。此外,当列出所有可能的组合时,我怀疑很容易犯错误。试着编写“任意 4 个中的 3 个”的代码,并确保您没有漏掉任何一个也没有重复。现在尝试一下“任意 7 个中的 5 个”。
return a+b+c>1;
- Joan Rieua ? (b || c): (b && c)
如果您喜欢,可以将其放入函数中,但它并不是非常复杂。解决方案在逻辑上简洁高效。
应该是:
(a || b && c) && (b || c && a)
此外,如果true
自动转换为1
,false
转换为0
:
(a + b*c) * (b + c*a) > 0
仅供参考,这只是完整加法器的一部分。在硬件上,您可以使用逻辑努力来确定基于不同布尔表达式的最佳电路。我猜传统的异或解决方案需要比帖子中提出的不太简洁的表达式更多的努力。
[a, b, c].count { |x| x } >= 2
这可以在JavaVM上的JRuby中运行。;-)这不是关于性能方面的问题,而是好的代码(可扩展和易于阅读的可重用代码)。
static boolean trueBooleans (int howMany,boolean ... bools)
{
int total = 0;
for (boolean b:bools)
if (b && (++total == howMany)) return true;
return false;
}
在我看来,编写Java程序时,易于处理意外变化和没有重复代码比简洁(脚本语言的领域)或快速的程序更重要。
这是一个完美的例子,用一次无意义的编写时间节省,换来了数十次阅读时间理解的代价,这让我深思。
为了避免使用三元运算符,我创建了以下函数:
function atLeastTwoTrue($a, $b, $c) {
$count = 0;
if ($a) { $count++; }
if ($b) { $count++; }
if ($c) { $count++; }
if ($count >= 2) {
return true;
} else {
return false;
}
}
这个解决方案是否像其他一些解决方案那样酷?不是。但它更易于理解吗?是的。这会导致更可维护、更少错误的代码吗?是的。
return ($count >= 2);
呢?此外,这个答案已经有人回答过了 - https://dev59.com/L3A75IYBdhLWcg3w1s32#3076954 - ChrisFfunction atLeastTwoAreTrue(a, b, c) {
return (a && b) || (b && c) || (a && c);
}
实际上,测试是如此刻意的,以至于编写最快、最神秘的方法是完全可以接受的,只要您用简单的注释进行说明。 但总的来说,在这个一行代码的世界中,我们需要更加可读的代码。 :-)
public bool lol(int minTrue, params bool[] bools)
{
return bools.Count( ( b ) => b ) >= minTrue;
}
一个电话会是这样:
lol( 2, true, true, false );
atLeastTwo(iWantYou, iNeedYou, imEverGonnaLoveYou)
- Andrew GrimmatLeastTwo(0,2,0)
。请问您的看法? - Ken