一个关于布尔值的面试题

探讨并分享了简化复杂布尔逻辑表达式的方法,通过改进示例代码,展示了多种优化技巧,包括直接返回条件表达式、使用三元运算符、卡诺图分析等,旨在提高代码效率与可读性。

有一个人在StackOverflow问了一个问题,这个问题是他在面试的时候面试官给他提的问题。这个问题是:给定三个布尔变量a、b、c,如果其中至少有三分之二的变量是真的话,就返回真。下面是他的解决方法:

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

然后面试官让他改进这个解法使得其更为简洁。但是他不知道如何改进,所以他把这个问题贴在StackOverflow上。有一些人给出了非常有用的解法。我认为这值得我们讨论,以此来使我们在编程中对布尔值和布尔表达式有更深的理解。这里分享其中一些解决方法。

有人说如果你有如下代码段,

if (someExpression) {
       return true;
   } else {
       return false;
   }

那你应该修改为:

return someExpression;

所以这个解法可以改进为:

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

当然还有其他非常好的答案,如Tim Stone给出的答案:

return a ^ b ? c : a

个人认为这是最简洁的一种解法了。

我们也可以用卡诺图来做:

return a ? (b || c) : (b && c);

如果我们给布尔值设定为0和1(真为1),那我们有:

a&b | b&c | c&a
a + b + c >= 2

然而如果我们不能把布尔值设定为0和1,那么我们可以有:

int howManyBooleansAreTrue =
(a ? 1 : 0)
+ (b ? 1 : 0)
+ (c ? 1 : 0);

return howManyBooleansAreTrue >= 2;

还有一个更好的方法:

(a==b) ? a : c;

你也想亲自试一试吗?请把你的答案贴在下面。

【翻译自: http://www.pixelstech.net/article/1335793772-A-boolean-value-interview-question

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值