面试题:布尔变量
下面这篇文章是从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;
欢迎你留下你的想法。
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《面试题:布尔变量》的相关评论
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
这个是不错。不好想到,感觉自己还是挺笨的啊
Return a&&b ? true : c
感觉这个面试题 !!!非常非常!!没有意义, 稍微了解os的都知道, 最开始的解法是机器运行最快的。。。所谓 “改进” 难道就是画蛇添足的 “显摆”么? 况且所有“改进”, 可读性都不如最开始的了然, 或许有人反驳 说 大多数人都能看得懂, 看懂的人或许会心一笑, 心里说 呵呵“这写法很牛逼”。。。但是 感觉完全没有意义
@SomeOne bool为true就是1吗?
@sjinny
return (a|b) | (a|c) | (b|c);
翻译是说2个以上,原题是至少两个。
anyway。。。
发个没看过的的,什么情况下会错呢。
return __builtin_popcount( a | (b << 1) | (c < 1;
这个问题应该首先问面试官,您是怎么定义改进的?
联想到一个题
输入1输出0,输入0输出1,有几种写法
x^1
!x
1-x
x?0:1
1>>x”
bool result = !!a + !!b + !!c >= 2;
怎么说呢,代码尽量追求简单吧,不然其实就会被测试人员当成是BUG返回了
将if else写成&&和||啊
a && (b||c) || (b&&c);
意思是:
if a then return b or c else b and c