面试题:布尔变量
下面这篇文章是从StackOverflow来的。LZ面试的时候遇到了一道面试题:“如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true”,于是LZ做了下面的这样的程序:
boolean atLeastTwo(boolean a, boolean b, boolean c) {
if ((a && b) || (b && c) || (a && c)) {
return true;
} else {
return false;
}
}
面试官接着问到,请对你的这个程序改进一下,但LZ不知道怎么改进,于是上StackOverflow上问了一下,下面是StackOverflow上的众网友的回答。再往下看的时候,希望你自己能先想一想怎么改进。
有人说,如果你有下面这样的代码?
if (someExpression) {
return true;
} else {
return false;
}
你应该改成:
return someExpression;
所以,LZ的代码应该写成:
return ((a && b) || (b && c) || (a && c));
当然,解法不单单只有一种,还有下面的这些解决:
1)使用卡诺图
return a ? (b || c) : (b && c);
2)使用异或
return a ^ b ? c : a
3)按照字面
(a?1:0)+(b?1:0)+(c?1:0) >= 2
a&&b || b&&c || a&&c
4)把Bool当成0和1
a&b | b&c | c&a
a + b + c <= 2
5)如果bool不能当成0和1,则:
int howManyBooleansAreTrue = (a ? 1 : 0) + (b ? 1 : 0) + (c ? 1 : 0); return howManyBooleansAreTrue >= 2;
欢迎你留下你的想法。

bool atLeast( int least, bool* bvec, size_t len )
{
int sum= 0;
for( size_t i= 0; i= least ){
return true;
}
}
return false;
}
return a ^ b ? c : a
这个赞一下!
@Ben
没什么好赞的啊。。。。。 有注释都要看半天才看得懂。。。
“得知其中有2个变量是true”是指“只能有两个T(一个F)”还是说“只要有两个或以上的T”就行呢?
看了原文才知道是后者:
given 3 boolean variables a, b, c, return true if at least 2 out of the 3 are true.
第4个比较爽
return ((!!a + !!b + !!c) == 2)
这个可以不?
有人觉得三元操作符难于维护,我也觉得是的:
这个也是StackOverFlow上人贴出来的,我觉得写的挺清晰的
function atLeastTwoTrue($a, $b, $c) {
$count = 0;
if ($a) { $count++; }
if ($b) { $count++; }
if ($c) { $count++; }
if ($count >= 2) {
return true;
} else {
return false;
}
}
@ulysses 我也这么想过。
a + b + c <= 2
这个注释很犀利啊~~
这个要看出题人的要求,如果是追求效率的,那可以写第四种,如果一般情况,第一种就可以了。
原因是,写代码最好是写那种既一看就明白,但是又不是很笨的那种。
用第一种的代码,完全省却了,写注释的必要。
后面那些附加的写法,做脑力考验尚可,真正写代码的时候,真的不推荐。
return (a || b) && (b || c);
都什么年代了,不要低估了编译器的智商
前几种都是编译器的小把戏,最终的目标代码是一样!
记住,代码看上去简单未必最终编译出来的代码也那么简洁,三元符和If else对编译器来说就是一种东西的不同写法而已
比如这个(a?1:0)+(b?1:0)+(c?1:0) >= 2,好好想想要多少次逻辑运算才能算出来
大家还不如直接写汇编代码吧,这个问题上,谁快谁慢一眼就看出来了
这个。。。
有必要吗?这样的代码一个月后连自己都看不懂了……
(a+b+c)>>1
@来一个
a = false;
b = true;
c = false;
( (a||b) && (b||c) )== true
return a&&b&&!c
if(!(!a||!b||!c))
{
return trun;
}
else
{
return false;
}
—http://www.gsdianping.com/
个人觉得第二种方法(使用异或)很精彩。
但是真正写软件的时候的时候,代码最好是一目了然的最好
@ulysses
f ($count >= 2) {
return true;
} else {
return false;
}
…
return $count >= 2;
“2个以上变量的值是true”, 等价于 最多有一个为false…
故:
return !(a || b);
2个以上,不包括两个啊
汗
return !!a + !!b + !!c >= 2
return a ^ b ? c : a
a = false, b = false, c = true?
如果不追求效率,编译器会进行优化,怎么写都差不多,最好直观一些;
如果追求效率,(1)如果bool取值为0和1,那么a+b+c>=2好;
(2)否则(a!=0)+(b!=0)+(c!=0)>=2好,聪明的编译器不会为a!=0生成跳转指令,所以更快。
if(a!=b)
{
return c;
}
else
{
return a;
}
这个漂亮。
a = false, b = false,则a ^ b = false,不会判断c
return (a + b + c >= 2);
function test( a, b ,c )
{
return (a||b)&&c;
}
喜欢卡诺图的那一个…
这个和异或那个是一样的算法啊
if(a) return b;
return a? b: b&&C;
@stanleyxu2005
php和js是可以这样做的,并且效率是最高的:
return +a+b+c >= 2;
现在的翻译真的很蛋疼。直译不知多好【给定3个布尔变量a,b,c,如果两个或两个以上变量的值为真,返回真】
(a|b)&c
你的解法是错误的 当ab均为真的时候 c是0 结果就错了@jason
a + b + c >= 2
@Ben
这个是不错。不好想到,感觉自己还是挺笨的啊