เราได้รับอาร์เรย์ n รายการ ซึ่งมีเพียง 2 ค่าเป็นตัวเลข ส่วนที่เหลือเป็น null เช่นนี้
const arr = [null, null, -1, null, null, null, -3, null, null, null];
เราต้องเขียนฟังก์ชันที่รับอาร์เรย์นี้และทำให้ลำดับเลขคณิตของตัวเลขสองตัวนี้สมบูรณ์ เพื่อเข้าใจปัญหานี้ชัดเจนขึ้น เราสามารถคิดว่าค่า null เป็นช่องว่างที่ต้องเติมตัวเลข เพื่อให้อาร์เรย์ทั้งหมดเป็นลำดับเลขคณิต
เกี่ยวกับลำดับเลขคณิต
ชุด/อาร์เรย์ของตัวเลขถูกกล่าวว่าเป็นลำดับเลขคณิต หากตัวเลขสุ่มใดๆ n จากอาร์เรย์ ถูกสร้างขึ้นโดยการบวกค่าคงที่ d เข้ากับตัวเลขลำดับ (n-1)
ตัวอย่าง
1, 2, 3, 4, 5, 6, 7, 8
ที่นี่ ทุกตัวเลขถัดไปได้มาจากการบวกค่าคงที่ (1 ในกรณีนี้) เข้ากับตัวเลขก่อนหน้า
ตัวอย่างอื่นๆ
1, 1, 1, 1, 1, 1, 1, 1, 1 10, 8, 6, 4, 2, 0, -2
องค์ประกอบแรกของชุดนี้มักแสดงด้วย a และความต่างร่วมในทุกตัวเลข แสดงด้วย d
ดังนั้น หากเราแสดงองค์ประกอบที่ n ของชุดแบบนี้ด้วย Tn แล้ว
Tn = a + (n -1)d
โดยที่ n คือดัชนีแบบ 1-based ของตัวเลขนั้น
เมื่อเข้าใจเรื่องนี้แล้ว มาเขียนโค้ดสำหรับปัญหาที่อธิบายไว้ เราจะหาองค์ประกอบแรก (a) และความต่างร่วม (d) ของอาร์เรย์ก่อน เมื่อได้ค่าทั้งสองแล้ว เราจะวนลูปผ่านอาร์เรย์ต้นฉบับเพื่อสร้างชุดข้อมูล
ตัวอย่าง
const arr = [null, null, -1, null, null, null, -3, null, null, null]; const arr2 = [null, null, -1, null, null, null, 12, null, null, null, null, null, null]; const constructSeries = (arr) => { const map = { first: undefined, last: undefined }; arr.forEach((el, ind) => { if(el !== null){ if(map['first']){ map['last'] = [el, ind]; }else{ map['first'] = [el, ind]; } }; }); const { first, last } = map; const commonDifference = (last[0] - first[0])/(last[1] - first[1]); const firstElement = (first[0]) - ((first[1])*commonDifference); return arr.map((item, index) => { return firstElement + (index * commonDifference); }); }; console.log(constructSeries(arr)); console.log(constructSeries(arr2));ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็นดังนี้
[ 0, -0.5, -1, -1.5, -2, -2.5, -3, -3.5, -4, -4.5 ] [ -7.5, -4.25, -1, 2.25, 5.5, 8.75, 12, 15.25, 18.5, 21.75, 25, 28.25, 31.5 ]