Các Bộ trưởng Vấn đề là một vấn đề nổi tiếng miêu tả là như sau:
- Bạn cần một thư ký mới
- Bạn có N ứng viên mà bạn có thể phỏng vấn cùng một lúc
- Bạn có thể chấm điểm từng ứng viên sau cuộc phỏng vấn. Hệ thống tính điểm của bạn sẽ không bao giờ cho hai ứng viên cùng số điểm
- Sau khi bạn phỏng vấn ứng viên, bạn phải đưa ra "có" hoặc "không" ngay lập tức
- Bạn muốn ứng viên có số điểm cao nhất
Giải pháp là phỏng vấn những floor(N/e)
người nộp đơn đầu tiên , và sau đó chấp nhận người nộp đơn đầu tiên có điểm cao hơn tất cả những người nộp đơn trước đó. Nếu không có ứng viên nào cao hơn, thì hãy trả lại người nộp đơn cuối cùng. Thật thú vị, điều này mang lại cho 1/e
phần trăm ứng viên hàng đầu thời gian. e
đề cập đến số của Euler . Để có được giá trị của e
, bạn có thể sử dụng nội dung log
hoặc mã hóa cứng đến ít nhất 5 điểm thập phân.
Đầu vào:
Một mảng không trống của các số nguyên không âm duy nhất không quá 2^31-1
.
Đầu ra:
Một số nguyên đại diện cho ứng cử viên được chọn. Để rõ ràng thuật toán là:
- Tìm phần tử tối đa trong các
floor(N/e)
phần tử đầu tiên của mảng. - Lặp lại qua các phần tử còn lại và trả về phần tử đầu tiên cao hơn mức tối đa được tìm thấy ở bước 1.
- Nếu không có phần tử nào cao hơn, trả về phần tử cuối cùng.
Ví dụ, giả sử mảng của bạn là [2,7,4,3,9,20]
, vì vậy N = 6
và floor(N/e) = 2
. 2 phần tử đầu tiên của mảng là [2,7]
. Tối đa [2,7]
là 7
. Các yếu tố còn lại là [4,3,9,20]
. Yếu tố đầu tiên lớn hơn 7
là 9
, vì vậy chúng tôi trở lại 9
.
Các trường hợp thử nghiệm:
[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
Giải pháp của bạn phải là O(n)
, n
chiều dài của mảng. Nếu ngôn ngữ của bạn có nội dung tìm thấy tối đa của một mảng, bạn có thể giả sử rằng hàm đó có O(n)
(và hy vọng là có).
Các sơ hở tiêu chuẩn được áp dụng, và đây là một môn đánh gôn , vì vậy hãy đưa ra câu trả lời ngắn nhất bằng ngôn ngữ yêu thích của bạn!
e
(ví dụ: Python, nơi e=2.71828
ngắn hơn import math;math.E
)
e
nên được sử dụng?