面试题:布尔变量

面试题:布尔变量

下面这篇文章是从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 ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (15 人打了分,平均分: 4.20 )
Loading...

面试题:布尔变量》的相关评论

  1. bool atLeast( int least, bool* bvec, size_t len )
    {
    int sum= 0;
    for( size_t i= 0; i= least ){
    return true;
    }
    }
    return false;
    }

  2. “得知其中有2个变量是true”是指“只能有两个T(一个F)”还是说“只要有两个或以上的T”就行呢?
    看了原文才知道是后者:
    given 3 boolean variables a, b, c, return true if at least 2 out of the 3 are true.

  3. 有人觉得三元操作符难于维护,我也觉得是的:

    这个也是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;
    }
    }

  4. 这个要看出题人的要求,如果是追求效率的,那可以写第四种,如果一般情况,第一种就可以了。

    原因是,写代码最好是写那种既一看就明白,但是又不是很笨的那种。
    用第一种的代码,完全省却了,写注释的必要。

    后面那些附加的写法,做脑力考验尚可,真正写代码的时候,真的不推荐。

  5. 都什么年代了,不要低估了编译器的智商
    前几种都是编译器的小把戏,最终的目标代码是一样!
    记住,代码看上去简单未必最终编译出来的代码也那么简洁,三元符和If else对编译器来说就是一种东西的不同写法而已
    比如这个(a?1:0)+(b?1:0)+(c?1:0) >= 2,好好想想要多少次逻辑运算才能算出来
    大家还不如直接写汇编代码吧,这个问题上,谁快谁慢一眼就看出来了

  6. “2个以上变量的值是true”, 等价于 最多有一个为false…
    故:
    return !(a || b);

  7. 如果不追求效率,编译器会进行优化,怎么写都差不多,最好直观一些;
    如果追求效率,(1)如果bool取值为0和1,那么a+b+c>=2好;
    (2)否则(a!=0)+(b!=0)+(c!=0)>=2好,聪明的编译器不会为a!=0生成跳转指令,所以更快。

  8. ShadowEdge :
    “得知其中有2个变量是true”是指“只能有两个T(一个F)”还是说“只要有两个或以上的T”就行呢?
    看了原文才知道是后者:
    given 3 boolean variables a, b, c, return true if at least 2 out of the 3 are true.

    现在的翻译真的很蛋疼。直译不知多好【给定3个布尔变量a,b,c,如果两个或两个以上变量的值为真,返回真】

  9. 感觉这个面试题 !!!非常非常!!没有意义, 稍微了解os的都知道, 最开始的解法是机器运行最快的。。。所谓 “改进” 难道就是画蛇添足的 “显摆”么? 况且所有“改进”, 可读性都不如最开始的了然, 或许有人反驳 说 大多数人都能看得懂, 看懂的人或许会心一笑, 心里说 呵呵“这写法很牛逼”。。。但是 感觉完全没有意义

  10. 翻译是说2个以上,原题是至少两个。

    anyway。。。
    发个没看过的的,什么情况下会错呢。
    return __builtin_popcount( a | (b << 1) | (c < 1;

  11. 怎么说呢,代码尽量追求简单吧,不然其实就会被测试人员当成是BUG返回了

  12. 将if else写成&&和||啊
    a && (b||c) || (b&&c);
    意思是:
    if a then return b or c else b and c

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注