该秘书问题被描述为一个如此著名的问题:
- 你需要新秘书
- 您有N个申请人,一次可以面试一次
- 面试后,您可以为每个申请人评分。您的计分系统永远不会给两个申请人相同的分数
- 面试申请人后,您必须立即给出“是”或“否”
- 您想要分数最高的申请人
解决方案是采访第一个floor(N/e)
申请人,然后接受分数高于所有先前申请人的第一个申请人。如果没有一个更高的申请人,则返回最后一个申请人。有趣的是,这给了最高的申请人1/e
时间百分比。 e
指欧拉数。要获取的值e
,您可以使用内置的log
或将其硬编码为至少5个小数点。
输入:
不大于的唯一非负整数的非空数组2^31-1
。
输出:
代表所选候选者的整数。要明确的算法是:
floor(N/e)
在数组的第一个元素中找到最大元素。- 遍历其余元素,并返回比第1步中找到的最大值高的第一个元素。
- 如果所有元素都不高于,则返回最后一个元素。
例如,假设您的数组是[2,7,4,3,9,20]
,则N = 6
和floor(N/e) = 2
。数组的前2个元素是[2,7]
。的最大值[2,7]
为7
。其余元素为[4,3,9,20]
。大于第一个元素7
是9
,所以我们返回9
。
测试用例:
[0] => 0
[100] => 100
[100, 45] => 100
[0, 1] => 0
[45, 100] => 45
[1, 4, 5] => 4
[1, 5, 4] => 5
[5, 4, 1] => 1
[5, 1, 4] => 4
[4, 1, 5] => 5
[56, 7, 37, 73, 90, 59, 65, 61, 29, 16, 47, 77, 60, 8, 1, 76, 36, 68, 34, 17, 23, 26, 12, 82, 52, 88, 45, 89, 94, 81, 3, 24, 43, 55, 38, 33, 15, 92, 79, 87, 14, 75, 41, 98, 31, 58, 53, 72, 39, 30, 2, 0, 49, 99, 28, 50, 80, 91, 83, 27, 64, 71, 93, 95, 11, 21, 6, 66, 51, 85, 48, 62, 22, 74, 69, 63, 86, 57, 97, 32, 84, 4, 18, 46, 20, 42, 25, 35, 9, 10, 19, 40, 54, 67, 70, 5, 44, 13, 78, 96]
=> 98
[10, 68, 52, 48, 81, 39, 85, 54, 3, 21, 31, 59, 28, 64, 42, 90, 79, 12, 63, 41, 58, 57, 13, 43, 74, 76, 94, 51, 99, 67, 49, 14, 6, 96, 18, 17, 32, 73, 56, 7, 16, 60, 61, 26, 86, 72, 20, 62, 4, 83, 15, 55, 70, 29, 23, 35, 77, 98, 92, 22, 38, 5, 50, 82, 1, 84, 93, 97, 65, 37, 45, 71, 25, 11, 19, 75, 78, 44, 46, 2, 53, 36, 0, 47, 88, 24, 80, 66, 87, 40, 69, 27, 9, 8, 91, 89, 34, 33, 95, 30]
=> 30
您的解决方案必须是O(n)
,其中n
数组的长度在哪里。如果您的语言具有可找到数组最大值的内置函数,则可以假定该函数可以使用O(n)
(并希望这样做)。
存在标准漏洞,这是代码缺陷,因此请以您喜欢的语言做出最短的答案!
e
(例如Python,其中e=2.71828
的小于import math;math.E
)
e
应该被使用?