Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

Next Greater Element in Circular Array ใน JavaScript


อาร์เรย์แบบวงกลม

อาร์เรย์ที่องค์ประกอบถัดไปขององค์ประกอบสุดท้ายเป็นองค์ประกอบแรกของอาร์เรย์มักเรียกว่าเป็นวงกลม

เห็นได้ชัดว่าไม่มีกลไกดังกล่าวในการจัดเก็บข้อมูลเช่นนี้ ข้อมูลจะยังคงถูกเก็บไว้ในบล็อกหน่วยความจำแบบต่อเนื่อง และอาร์เรย์แบบวงกลมเป็นเหมือนแนวคิดมากกว่าความเป็นจริง

ปัญหา

เราจำเป็นต้องเขียนฟังก์ชัน 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]