อาร์เรย์แบบวงกลม
อาร์เรย์ที่องค์ประกอบถัดไปขององค์ประกอบสุดท้ายเป็นองค์ประกอบแรกของอาร์เรย์มักเรียกว่าเป็นวงกลม
เห็นได้ชัดว่าไม่มีกลไกดังกล่าวในการจัดเก็บข้อมูลเช่นนี้ ข้อมูลจะยังคงถูกเก็บไว้ในบล็อกหน่วยความจำแบบต่อเนื่อง และอาร์เรย์แบบวงกลมเป็นเหมือนแนวคิดมากกว่าความเป็นจริง
ปัญหา
เราจำเป็นต้องเขียนฟังก์ชัน 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]