Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

อัลกอริทึมที่ถูกต้องเพื่อได้ Array B จาก Array A โดยนับย้อนกลับจาก element สุดท้ายใน JavaScript

พิจารณาอาร์เรย์ไบนารีต่อไปนี้ (Array A):

const arr = [1, 0, 1, 1, 1, 1, 0, 1, 1];

เมื่ออาร์เรย์นี้ผ่านฟังก์ชัน sumRight() จะผลิตอาร์เรย์เอาต์พุต (Array B) ดังนี้:

const output = [1, 0, 4, 3, 2, 1, 0, 2, 1];

การเข้าใจฟังก์ชัน

องค์ประกอบในอาร์เรย์ arr เป็น 0 หรือ 1 เท่านั้น ฟังก์ชันนับย้อนกลับจากองค์ประกอบสุดท้ายของ arr ถ้ามี 1 ติดกันใน arr องค์ประกอบที่ตรงกันในอาร์เรย์เอาต์พุทจะเป็น 1 แต่สำหรับ 1 ตัวที่สองที่ติดกันใน arr จะเป็น 2 สำหรับตัวที่สามในอินพุท จะเป็น 3 แตสำหรับ 0 ใน arr จะเป็น 0 ในเอาต์พุทเช่นกัน

มาเขียนโค้ดสำหรับฟังก์ชันนี้โดยใช้เมธอด Array.prototype.reduceRight() ซึ่งทำงานเหมือน reduce ปกติ แค่เริ่มจากขวาแทนซ้าย:

ตัวอย่างโค้ด

const arr = [1, 0, 1, 1, 1, 1, 0, 1, 1];

const sumRight = arr => {
  return arr.reduceRight((acc, val) => {
    const { prev, res } = acc;
    if (val === 0) {
      return {
        prev: 0,
        res: res.concat(0)
      };
    }
    return {
      res: res.concat(val + prev),
      prev: prev + 1
    };
  }, {
    prev: 0,
    res: []
  }).res.reverse();
};

console.log(sumRight(arr));

ผลลัพธ์

ผลลัพธ์ในคอนโซลจะเป็นดังนี้:

[ 1, 0, 4, 3, 2, 1, 0, 2, 1 ]