首页 > 杂项资源, 趣味问题 > 面试题:布尔变量

面试题:布尔变量

2010年6月23日 发表评论 阅读评论 8,110 人阅读    

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

——=== 访问 酷壳404页面 寻找遗失儿童。 ===——
好烂啊有点差凑合看看还不错很精彩 (12 人打了分,平均分: 5.00 )
Loading ... Loading ...
  1. sjinny
    2010年6月23日09:06 | #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. 2010年6月23日09:49 | #2

    return a ^ b ? c : a

    这个赞一下!

  3. rhapsodyn
    2010年6月23日10:55 | #3

    @Ben
    没什么好赞的啊。。。。。 有注释都要看半天才看得懂。。。

  4. ShadowEdge
    2010年6月23日11:03 | #4

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

  5. otg
    2010年6月23日11:39 | #5

    第4个比较爽

  6. lyre
    2010年6月23日11:50 | #6

    return ((!!a + !!b + !!c) == 2)
    这个可以不?

  7. ulysses
    2010年6月23日11:52 | #7

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

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

  8. 2010年6月23日13:10 | #8

    @ulysses 我也这么想过。

  9. SomeOne
    2010年6月23日13:35 | #9

    a + b + c <= 2
    这个注释很犀利啊~~

  10. 2010年6月23日14:09 | #10

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

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

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

  11. 来一个
    2010年6月23日14:18 | #11

    return (a || b) && (b || c);

  12. modernmozart@gmail.com
    2010年6月23日16:18 | #12

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

  13. 2010年6月23日19:51 | #13

    这个。。。

  14. lasu
    2010年6月24日19:55 | #14

    有必要吗?这样的代码一个月后连自己都看不懂了……

  15. Kabie
    2010年6月24日21:55 | #15

    (a+b+c)>>1

  16. iceout
    2010年6月24日23:39 | #16

    @来一个
    a = false;
    b = true;
    c = false;

    ( (a||b) && (b||c) )== true

  17. Sunway
    2010年6月25日01:53 | #17

    return a&&b&&!c

  18. 2010年6月25日16:23 | #18

    if(!(!a||!b||!c))
    {
    return trun;
    }
    else
    {
    return false;
    }
    —http://www.gsdianping.com/

  19. 2010年6月26日15:56 | #19

    个人觉得第二种方法(使用异或)很精彩。
    但是真正写软件的时候的时候,代码最好是一目了然的最好

  20. iqueen
    2010年6月29日10:12 | #20

    @ulysses
    f ($count >= 2) {
    return true;
    } else {
    return false;
    }

    return $count >= 2;

  21. DeamonTX
    2010年6月29日21:41 | #21

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

  22. kezhang
    2010年7月2日08:28 | #22

    2个以上,不包括两个啊

  23. procat
    2010年7月2日13:05 | #23

    return !!a + !!b + !!c >= 2

  24. haterh
    2010年7月2日18:15 | #24

    return a ^ b ? c : a

    a = false, b = false, c = true?

  25. 2010年7月6日18:11 | #25

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

  26. ydStudio
    2010年7月7日23:01 | #26

    if(a!=b)
    {
    return c;
    }
    else
    {
    return a;
    }

  27. ydStudio高手
    2010年7月13日11:48 | #27

    ydStudio :if(a!=b){return c;}else{return a;}

    这个漂亮。

  28. geetarker
    2010年7月16日11:37 | #28

    haterh :
    return a ^ b ? c : a
    a = false, b = false, c = true?

    a = false, b = false,则a ^ b = false,不会判断c

  29. arigatou1985
    2010年7月22日17:23 | #29

    return (a + b + c >= 2);

  30. killua.vx
    2010年7月23日18:09 | #30

    function test( a, b ,c )
    {
    return (a||b)&&c;
    }

  31. YC_YUY
    2010年9月5日11:09 | #31

    喜欢卡诺图的那一个…

  32. 2011年4月11日13:18 | #32

    ydStudio高手 :

    ydStudio :if(a!=b){return c;}else{return a;}

    这个漂亮。

    这个和异或那个是一样的算法啊

  33. aigis
    2011年4月21日17:26 | #33

    if(a) return b;

  34. aigis
    2011年4月21日17:28 | #34

    return a? b: b&&C;

  35. Rocky
    2011年4月29日13:23 | #35

    @stanleyxu2005
    php和js是可以这样做的,并且效率是最高的:

    return +a+b+c >= 2;

  36. JinCeon
    2011年5月3日09:05 | #36

    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,如果两个或两个以上变量的值为真,返回真】

  37. jason
    2011年6月7日12:53 | #37

    (a|b)&c

  38. 2011年6月22日23:18 | #38

    你的解法是错误的 当ab均为真的时候 c是0 结果就错了@jason

  39. songtianyi
    2011年7月5日16:23 | #39

    a + b + c >= 2

  40. Barbapapa
    2011年10月11日19:23 | #40

    @Ben
    这个是不错。不好想到,感觉自己还是挺笨的啊

  41. harry
    2012年4月19日16:27 | #41

    Return a&&b ? true : c

  42. 西瓜
    2012年5月8日10:57 | #42

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

  43. super_fish
    2012年8月5日14:59 | #43

    @SomeOne bool为true就是1吗?

  44. crazyman
    2012年10月3日12:14 | #44

    @sjinny
    return (a|b) | (a|c) | (b|c);

  45. Calvinxiao
    2012年10月30日13:25 | #45

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

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

  46. tlh1987
    2012年11月5日10:38 | #46

    这个问题应该首先问面试官,您是怎么定义改进的?

  47. jam
    2012年11月14日13:36 | #47

    联想到一个题
    输入1输出0,输入0输出1,有几种写法

    x^1
    !x
    1-x
    x?0:1
    1>>x”

  1. 本文目前尚无任何 trackbacks 和 pingbacks.