เลขานุการปัญหาเป็นปัญหาที่มีชื่อเสียงอธิบายเป็นดังนี้:
- คุณต้องการเลขาคนใหม่
- คุณมีผู้สมัคร N คนที่สามารถสัมภาษณ์ครั้งละหนึ่งคน
- คุณสามารถให้คะแนนผู้สมัครแต่ละคนหลังการสัมภาษณ์ ระบบการให้คะแนนของคุณจะไม่ให้คะแนนเดียวกันกับผู้สมัครสองคน
- หลังจากที่คุณสัมภาษณ์ผู้สมัครคุณต้องให้ "ใช่" หรือ "ไม่" ทันที
- คุณต้องการผู้สมัครที่มีคะแนนสูงสุด
วิธีการแก้ปัญหาคือการสัมภาษณ์floor(N/e)
ผู้สมัครคนแรกและยอมรับผู้สมัครคนแรกที่มีคะแนนสูงกว่าผู้สมัครคนก่อนหน้าทั้งหมด หากไม่มีผู้สมัครคนใดสูงกว่าให้ส่งคืนผู้สมัครคนสุดท้าย ที่น่าสนใจคือสิ่งนี้ให้1/e
เปอร์เซ็นต์ ผู้สมัครสูงสุด e
หมายถึงจำนวนออยเลอร์ ในการรับค่าของe
คุณสามารถใช้ builtin log
หรือ hardcode ให้เป็นทศนิยมอย่างน้อย 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
ควรใช้