An interviewer recently asked me this question: given 3 boolean variables a, b, c, return true if at least 2 out of the 3 are true.

My solution follows:

boolean atLeastTwo(boolean a, boolean b, boolean c) {

if ((a && b) || (b && c) || (a && c)) {

return true;

}else{

return false;

}

}

He said that this can be improved further, but I'm not sure how?

Source:

*Tips4all*
Rather than writing:

ReplyDeleteif (someExpression) {

return true;

} else {

return false;

}

Write:

return someExpression;

As for the expression itself, something like this:

boolean atLeastTwo(boolean a, boolean b, boolean c) {

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

}

or this (whichever you find easier to grasp):

boolean atLeastTwo(boolean a, boolean b, boolean c) {

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

}

It tests a and b exactly once, and c at most once.

References

JLS 15.25 Conditional Operator ? :

Just for the sake of using XOR to answer a relatively straight-forward problem...

ReplyDeletereturn a ^ b ? c : a