閱讀946 返回首頁    go 阿裏雲 go 技術社區[雲棲]


一道麵試題:布爾變量

FROM:酷殼

下麵這篇文章是從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;

歡迎你留下你的想法。 

最後更新:2017-04-03 18:51:55

  上一篇:go C語言實現二叉樹的常用的算法(遞歸與非遞歸實現遍曆)
  下一篇:go 受英特爾收購傳聞影響 AMD股價當日大漲14%