本文正在参加「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