撞了一个旧线程,但它仍然是最短的解决方案,没有人提到它。
解决方案:
int median2(int a, int b, int c) {
return (a > b) ^ (a > c) ? a : (a > b) ^ (b > c) ? c : b;
}
测试:
(测试涵盖所有可能的组合,全部打印 6)
public static void main(String[] args) {
System.out.println(median(3, 6, 9));
System.out.println(median(3, 9, 6));
System.out.println(median(6, 3, 9));
System.out.println(median(6, 9, 3));
System.out.println(median(9, 3, 6));
System.out.println(median(9, 6, 3));
System.out.println(median(6, 6, 3));
System.out.println(median(6, 6, 9));
System.out.println(median(6, 3, 6));
System.out.println(median(6, 9, 6));
System.out.println(median(3, 6, 6));
System.out.println(median(9, 6, 6));
System.out.println(median(6, 6, 6));
}
说明1
(a > b) ^ (a > c) 如果c > a > b 或c < a < b 为假,则返回a;
否则(a > b) ^ (b > c) false 如果a > b > c 或a < b < c - 返回b;
否则返回 c;
说明2
假设p = a > b; q = b > c; s = a > c;
让我们建立一个Karnaugh map。
| 00 01 11 10 (p, q)
---+----------------------
0 | b c * a
1 | * a b c
(s)|
*表示组合是不可能的(如a > b; b > c; a < c)
注意右边部分是镜像的左边部分,可以通过引入t = p ^ q; u = s ^ p来简化地图
| 0 1 (t)
---+---------
0 | b c
1 | * a
(u)|
所以函数可以写成
private static int median(int a, int b, int c) {
boolean t = (a > b) ^ (b > c);
boolean u = (a > b) ^ (a > c);
if (u)
return a;
else if (t)
return c;
else
return b;
}
内联变量并用 ? 替换 ifs:给出答案
int median2(int a, int b, int c) {
return (a > b) ^ (a > c) ? a : (a > b) ^ (b > c) ? c : b;
}
即使输入上的某些输入相等,该解决方案也能正常工作,这可能并不明显,但很合乎逻辑。