最近面试官问了我这个问题:给定三个布尔型变量a、b和c,如果其中至少有两个是true,则返回true。
我的解决方案如下:
boolean atLeastTwo(boolean a, boolean b, boolean c) {
if ((a && b) || (b && c) || (a && c)) {
return true;
}
else{
return false;
}
}
他说这还可以进一步改善,但如何呢?
最近面试官问了我这个问题:给定三个布尔型变量a、b和c,如果其中至少有两个是true,则返回true。
我的解决方案如下:
boolean atLeastTwo(boolean a, boolean b, boolean c) {
if ((a && b) || (b && c) || (a && c)) {
return true;
}
else{
return false;
}
}
他说这还可以进一步改善,但如何呢?
int count=0;
boolean atLeastTwo(boolean a, boolean b, boolean c) {
if (a)
count++;
if (b)
count++;
if (c)
count++;
if (count>1)
return true;
else
return false;
}
boolean atLeastTwo(boolean a, boolean b, boolean c) {
bool result = !(a ^ b ^ c) && !(!a & !b & !c) || (a & b & c);
return result;
}
a'bc + abc' + abc + ab'c
bc + ab + ac
通过对a'bc和abc'的异或运算,并结合abc和ab'c的最小项,可以进一步减少这个表达式:
b(a ^ c) + ac
这绝对是一个关于解决问题和思维方式的问题,而不是你的编码能力。
稍微简洁一点的版本可以是
返回 ((a ^ b) && (b ^ c)) ^ b
但像先前的某个发帖者所说,如果我在任何我的工作中看到这种代码,我会训斥他的。:)
我没有看到其他人指出的一件事是,在面试中“请给我写些代码”的部分中,通常会说“你能改进吗?”或“你对此完全满意吗?”或“这是尽可能优化了吗?”,当你说你完成时。有可能你听到的“你怎么改进它”是“这可能需要改进;怎么改进?”在这种情况下,将if(x) return true; else return false;
习惯用法更改为只是return x
是一种改进-但要注意,有时他们只想看看你对问题的反应。我听说有些面试官会坚持认为完美的代码存在缺陷,只是为了看看你如何应对。
这个问题中的2和3显然是神奇数字。"正确"的答案将取决于面试官是想了解你对布尔逻辑的理解(在这方面,我认为pdox的答案是最好的),还是想了解你对架构问题的理解。
我倾向于使用map-reduce解决方案,它可以接受任何类型的列表和任意的条件。
让三个布尔值为A,B和C...
您可以使用k-MAP并得出一个布尔表达式...
在这种情况下,布尔表达式将是A(B+C)+C
或者if((A && (B || C )) || C) { return true; } else return false;
如何看待Java中的 (a||b) && (a||c)
- 与OP的六次比较相比,只需要三次比较。
错了,我应该早些进行检查。
如果我将布尔值转换为数字,并且该数字不是2的幂,则它至少有两个true。
a*4 + b*2 + c*1 = N
return( N != 0 && (N&(N-1)) != 0)
我只是提供一个替代方案。
atLeastTwo(iWantYou, iNeedYou, imEverGonnaLoveYou)
- Andrew GrimmatLeastTwo(0,2,0)
。请问您的看法? - Ken