在三个数字中找到第n个最大数字

时间:2015-01-09 23:43:48

标签: algorithm

给出数字k,a,b,c。如何在不使用if或任何数组或循环的情况下找到a,b和c中的第k个最大数字。提供最小或最大功能。

1 个答案:

答案 0 :(得分:3)

你需要类似C ++片段的东西。在其他语言中,它可能看起来不同。

auto 1st = max(a,max(b,c));
auto 3rd = min(a,min(b,c));
auto 2nd = a+b+c-1st-3rd;
return (2-k)*(3-k)*1st/2 + (k-1)*(3-k)*2nd + (k-1)*(k-2)*3rd/2;

假设k等于数字1,2,3中的一个。

合并2条评论结果更美:

#define maybe(x) x*(x!=n1&&x!=n3)
auto n1 = max(a,max(b,c));
auto n3 = min(a,min(b,c));
auto n2 = maybe(a)+maybe(b)+maybe(c);
return n1*(k==1) + n2*(k==2) + n3*(k==3);

此外,我的第一个版本忽略了标识符不能以数字开头的事实。

在某些语言中,(k == 1)不能用作整数,或者不能保证为0或1.在这些语言中,第1版可能会更好。

关于溢出:这取决于类型。

对于整数类型,a + b + c-n1-n3可能会导致溢出,但仍然是正确的。这就是为什么:+ b + c-n1-n3的结果在低位中是正确的。例如,如果我们使用32位数字,a,b和c将是32位数字,结果将在最低32位中正确。也就是说,结果将是a或be或c。这是正确的。考虑到浮动数字^不会起作用,而问题没有指定数字的类型,我会从^返回到+和 - 。

对于非整数类型,溢出可能会引入舍入错误。为了避免这种情况,我现在选择了一个不使用+或 - 的实现,除非添加0。