รับรายการจำนวนเต็มเรียงลำดับสร้างแผนภูมิการค้นหาแบบไบนารีที่สมดุลซึ่งแสดงเป็นอาร์เรย์โดยไม่ต้องใช้การสอบถามซ้ำ
ตัวอย่างเช่น:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
ก่อนที่เราจะเริ่มต้นคำแนะนำ: เราสามารถทำให้ปัญหานี้ง่ายขึ้นเป็นตันเพื่อที่เราจะได้ไม่ต้องคิดเกี่ยวกับจำนวนเต็มอินพุท (หรือวัตถุใด ๆ ที่เทียบเท่าสำหรับเรื่องนั้น!)
หากเรารู้ว่ารายการอินพุตถูกเรียงลำดับแล้วเนื้อหาจะไม่เกี่ยวข้อง เราสามารถคิดถึงมันในแง่ของดัชนีไปยังอาร์เรย์เดิม
การเป็นตัวแทนภายในของอาร์เรย์อินพุตจะกลายเป็น:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
นี่หมายถึงแทนที่จะเขียนสิ่งที่ต้องจัดการกับวัตถุที่เทียบเคียงได้เราเพียงแค่ต้องเขียนฟังก์ชันที่แมปจากช่วง [0, n) ไปยังอาร์เรย์ผลลัพธ์ เมื่อเรามีคำสั่งซื้อใหม่เราสามารถใช้การจับคู่กลับกับค่าในอินพุตเพื่อสร้างอาร์เรย์ส่งคืน
โซลูชั่นที่ถูกต้องจะต้อง:
- ยอมรับอาร์เรย์ที่มีองค์ประกอบเป็นศูนย์และส่งกลับอาร์เรย์ที่ว่างเปล่า
- ยอมรับอาร์เรย์จำนวนเต็มที่มีความยาวnและส่งคืนอาร์เรย์จำนวนเต็ม
- ของความยาวระหว่างnและกำลังสูงสุดถัดไปคือ 2 ลบ 1 (เช่นสำหรับขนาดอินพุต 13 จะคืนค่าได้ทุกที่ระหว่าง 13 ถึง 15)
- Array ซึ่งแสดงถึง BST โดยที่โหนดรูทอยู่ที่ตำแหน่ง 0 และความสูงเท่ากับlog (n)โดยที่ 0 แทนโหนดที่หายไป (หรือ
null
ค่าที่เหมือนกันถ้าภาษาของคุณอนุญาต) โหนดว่างเปล่าหากมีจะต้องมีอยู่ที่ส่วนท้ายของต้นไม้ (เช่น[2,1,0]
)
อาร์เรย์จำนวนเต็มอินพุตมีการรับประกันต่อไปนี้:
- ค่าเป็นจำนวนเต็มแบบ 32 บิตที่มากกว่าศูนย์
- คุณค่านั้นไม่เหมือนใคร
- ค่าอยู่ในลำดับจากน้อยไปมากจากตำแหน่งศูนย์
- ค่าอาจกระจัดกระจาย (กล่าวคือไม่ติดกัน)
รหัสสั้นที่สุดโดยการนับตัวอักษร ascii ชนะ แต่ฉันก็สนใจที่จะเห็นวิธีแก้ปัญหาที่สง่างามสำหรับภาษาใด ๆ
กรณีทดสอบ
เอาท์พุทสำหรับอาร์เรย์ที่เรียบง่ายมี1
การต่างๆn
n
ตามที่อธิบายไว้ข้างต้น0
s ต่อท้ายเป็นตัวเลือก
[]
[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]