อาร์เรย์แบบวงกลม
อาร์เรย์ที่องค์ประกอบถัดไปขององค์ประกอบสุดท้ายเป็นองค์ประกอบแรกของอาร์เรย์มักเรียกว่าเป็นวงกลม
เห็นได้ชัดว่าไม่มีกลไกดังกล่าวในการจัดเก็บข้อมูลเช่นนี้ ข้อมูลจะยังคงถูกเก็บไว้ในบล็อกหน่วยความจำแบบต่อเนื่อง และอาร์เรย์แบบวงกลมเป็นเหมือนแนวคิดมากกว่าความเป็นจริง
ปัญหา
เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์แบบวงกลมของ Integers, arr เป็นอาร์กิวเมนต์แรกและอาร์กิวเมนต์เดียว
จากนั้นฟังก์ชันควรสร้างและส่งคืนอาร์เรย์ที่มีองค์ประกอบที่ใหญ่กว่าถัดไปสำหรับแต่ละองค์ประกอบที่สอดคล้องกันของอาร์เรย์ดั้งเดิม จำนวนที่มากขึ้นถัดไปของตัวเลข เรียกว่า num เป็นจำนวนที่มากกว่าตัวแรกของลำดับการเคลื่อนที่ (ในกรณีของเรา) ถัดไปในอาร์เรย์ ซึ่งหมายความว่าเราสามารถค้นหาแบบวงกลมเพื่อหาจำนวนที่มากกว่าถัดไป หากไม่มีอยู่ เราควรพิจารณา -1 สำหรับตัวเลขนี้
ตัวอย่างเช่น หากอินพุตของฟังก์ชันคือ −
const arr = [7, 8, 7];
จากนั้นผลลัพธ์ควรเป็น −
const output = [8, -1, 8];
คำอธิบายผลลัพธ์
ถัดไปที่มากกว่าทั้ง 7 ในอาร์เรย์คือ 8 และเนื่องจากอาร์เรย์เป็นวงกลม แต่สำหรับ 8 ไม่มีองค์ประกอบใดที่มากกว่าดังนั้นเราจึงใส่ -1 สำหรับมัน
ตัวอย่าง
รหัสสำหรับสิ่งนี้จะเป็น −
const arr = [7, 8, 7]; const nextGreaterElement = (arr = []) => { const res = []; const stack = []; if (!arr || arr.length < 1){ return res; }; for (let i = 0; i < arr.length; i++) { while (stack.length > 0 && arr[stack[stack.length - 1]] < arr[i]) { const small = stack.pop(); res[small] = arr[i]; }; stack.push(i); } for (let i = 0; i < arr.length; i++) { while (stack.length > 0 && arr[stack[stack.length - 1]] < arr[i]) { const small = stack.pop(); res[small] = arr[i]; }; } const rem = stack.length; for (let i = 0; i < rem; i++) { res[stack.pop()] = -1; } return res; }; console.log(nextGreaterElement(arr));
คำอธิบายโค้ด:
ขณะวนซ้ำในอาร์เรย์หากเราพบองค์ประกอบที่ใหญ่กว่าหนึ่งในสแต็ก เราจะตั้งค่า res[small] เป็นองค์ประกอบที่ใหญ่กว่าปัจจุบันที่พบ
ตอนนี้ เราเริ่มต้นอีกครั้งจากจุดเริ่มต้นของ arr และจัดการกับองค์ประกอบที่เราไม่พบองค์ประกอบที่ใหญ่กว่าถัดไปในลูปก่อนหน้า ท้ายที่สุด ยังคงมีองค์ประกอบบางอย่างที่ไม่มีองค์ประกอบอื่นที่ยิ่งใหญ่ไปกว่านั้น
ผลลัพธ์
และผลลัพธ์ในคอนโซลจะเป็น −
[8, -1, 8]