โจทย์
เรียงค่าทั้งหมดในลิสต์จากน้อยไปมาก สำหรับกรณีที่จำนวนสมาชิกเป็นเลขคี่ ให้เลือกค่าตรงกลาง สำหรับกรณีที่จำนวนสมาชิกเป็นเลขคู่ ให้หาค่าเฉลี่ยเลขคณิตของสองค่ากลาง ข้อนี้รับเฉพาะลิสต์ที่ไม่ว่างเปล่าเท่านั้น
ให้เขียนฟังก์ชัน median_number(numbers)
อินพุต
numbers: ลิสต์ที่ไม่ว่างเปล่าของค่า
เอาต์พุต
คืนค่ามัธยฐานเป็นตัวเลข ซึ่งอาจลงท้ายด้วย .5 ได้
เงื่อนไข
1 ≤ ความยาวลิสต์ ≤ 100,000 แต่ละค่าจะเป็นจำนวนเต็มระหว่าง −1,000,000,000 ถึง 1,000,000,000
ตัวอย่าง
อินพุต:
numbers = [2, 8, 4, 10]
ผลลัพธ์ที่คาดหวัง:
expected = 6.0
อินพุต:
std::vector<long long> numbers = {2, 8, 4, 10};
ผลลัพธ์ที่คาดหวัง:
double expected = 6.0;
อินพุต:
long[] numbers = new long[] {2, 8, 4, 10};
ผลลัพธ์ที่คาดหวัง:
double expected = 6.0;
คำอธิบาย
ลำดับที่เรียงแล้วคือ 2, 4, 8, 10 คู่กลางคือ 4 กับ 8 เฉลี่ยได้ (4 + 8) / 2 = 6
อินพุต:
numbers = [9, 1, 4]
ผลลัพธ์ที่คาดหวัง:
expected = 4.0
อินพุต:
std::vector<long long> numbers = {9, 1, 4};
ผลลัพธ์ที่คาดหวัง:
double expected = 4.0;
อินพุต:
long[] numbers = new long[] {9, 1, 4};
ผลลัพธ์ที่คาดหวัง:
double expected = 4.0;
คำอธิบาย
ลำดับที่เรียงแล้วคือ 1, 4, 9 ค่ากลางคือ 4
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
median ขึ้นกับลำดับหลังเรียง ดังนั้นตำแหน่งใน list ที่เรียงแล้วคือสิ่งสำคัญ
คำใบ้ 2
หลัง sort ถ้า len คี่ให้ใช้ตัวกลางตัวเดียว ถ้า len คู่ให้เอาสองตัวกลางมารวมกัน
คำใบ้ 3
ระวังการเฉลี่ยสองค่ากลางให้ดี เพราะคำตอบอาจลงท้ายด้วย .5
ความซับซ้อนที่คาดหวัง
เวลา O(n log n), หน่วยความจำเพิ่ม O(n)
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน