Đưa ra một danh sách các số nguyên duy nhất, được sắp xếp, tạo một cây tìm kiếm nhị phân cân bằng được biểu diễn dưới dạng một mảng mà không sử dụng đệ quy.
Ví dụ:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
Trước khi bắt đầu, một gợi ý: chúng ta có thể đơn giản hóa vấn đề này một tấn để chúng ta không thực sự phải suy nghĩ về các số nguyên đầu vào (hoặc bất kỳ đối tượng có thể so sánh nào cho vấn đề đó!).
Nếu chúng ta biết danh sách đầu vào đã được sắp xếp, nội dung của nó không liên quan. Chúng ta có thể chỉ cần nghĩ về nó theo các chỉ số vào mảng ban đầu.
Một đại diện bên trong của mảng đầu vào sau đó trở thành:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
Điều này có nghĩa là thay vì viết một cái gì đó phải xử lý các đối tượng có thể so sánh, chúng ta thực sự chỉ cần viết một hàm ánh xạ từ phạm vi [0, n) sang mảng kết quả. Khi chúng ta có thứ tự mới, chúng ta chỉ cần áp dụng ánh xạ trở lại các giá trị trong đầu vào để tạo mảng trả về.
Các giải pháp hợp lệ phải:
- Chấp nhận một mảng phần tử zero và trả về một mảng trống.
- Chấp nhận một mảng số nguyên có độ dài n và trả về một mảng số nguyên
- Có độ dài giữa n và công suất cao nhất tiếp theo là 2 trừ 1. (ví dụ, đối với kích thước đầu vào 13 trả về bất cứ nơi nào trong khoảng từ 13 đến 15).
- Mảng đại diện cho một BST trong đó nút gốc ở vị trí 0 và chiều cao bằng log (n) trong đó 0 đại diện cho một nút bị thiếu (hoặc
null
giá trị giống như nếu ngôn ngữ của bạn cho phép). Các nút trống, nếu có, chỉ phải tồn tại ở cuối cây (ví dụ[2,1,0]
:)
Mảng số nguyên đầu vào có các đảm bảo sau:
- Giá trị là các số nguyên có chữ ký 32 bit lớn hơn 0.
- Giá trị là duy nhất.
- Các giá trị theo thứ tự tăng dần từ vị trí 0.
- Các giá trị có thể thưa thớt (nghĩa là không liền kề nhau).
Mã ngắn gọn nhất bằng số ký tự ascii chiến thắng, nhưng tôi cũng thích xem các giải pháp tao nhã cho bất kỳ ngôn ngữ cụ thể nào.
Các trường hợp thử nghiệm
Các kết quả cho mảng đơn giản chứa 1
để n
cho khác nhau n
. Như mô tả ở trên, các dấu 0
là tùy chọn.
[]
[1]
[2,1,0]
[2,1,3]
[3,2,4,1,0,0,0]
[4,2,5,1,3,0,0]
[4,2,6,1,3,5,0]
[4,2,6,1,3,5,7]
[5,3,7,2,4,6,8,1,0,0,0,0,0,0,0]
[6,4,8,2,5,7,9,1,3,0,0,0,0,0,0]
[7,4,9,2,6,8,10,1,3,5,0,0,0,0,0]
[8,4,10,2,6,9,11,1,3,5,7,0,0,0,0]
[8,4,11,2,6,10,12,1,3,5,7,9,0,0,0]
[8,4,12,2,6,10,13,1,3,5,7,9,11,0,0]
[8,4,12,2,6,10,14,1,3,5,7,9,11,13,0]
[8,4,12,2,6,10,14,1,3,5,7,9,11,13,15]