2.5 如何检查三个布尔中至少两个是否为真| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>
提问:如何检查三个布尔中至少两个是否为真?

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

我是这么回答的:

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

面试官说可以进一步改善,但我不会了,要怎么改善呢?

回答1:
首先,你的写法有些冗余,不应该写

if (someExpression) {
    return true;
} else {
    return false;
}
复制代码

而应该写

return someExpression;
复制代码

回到题目,则应该写为:

boolean atLeastTwo(boolean a, boolean b, boolean c) {
    return a ? (b || c) : (b && c);
}
复制代码

如果a不是true,那么bc必须都是true才会返回true。
如果a是true,那么bc只要有一个true就会返回true
否则返回false。

或者也可以换一种表达方式:

boolean atLeastTwo(boolean a, boolean b, boolean c) {
    return a && (b || c) || (b && c);
}
复制代码

但这种方式没有第一种阅读起来简单。

回答2:
还有一些更加酷炫的方式:

boolean atLeastTwo(boolean a, boolean b, boolean c) {
    return a ^ b ? c : a;
}
复制代码

如果a和b不同,则必有一个1一个0,因此c是什么就返回什么。
如果a和b相同,要么都是1,要么都是0,则他们本身是什么,就是什么。

在已知上面两个条件的前提下,我们可以轻松写出以下代码:

boolean atLeastTwo(boolean a, boolean b, boolean c) {
    return a == b ? a : c;
}
复制代码

这种方法也更加易于理解。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享