ลบสมาชิกที่ซ้ำติดกัน (consecutive duplicates) ในอาร์เรย์แบบ in-place ด้วย recursion
ตัวอย่าง
Input: [17, 17, 17, 12, 12, 354, 354, 1, 1, 1] Output: [17, 12, 354, 1]
ตัวอย่างโค้ด
const arr = [17, 17, 17, 12, 12, 354, 354, 1, 1, 1];
const comp = (arr, len = 0, deletable = false) => {
if (len < arr.length) {
if (deletable) {
arr.splice(len, 1);
len--; // ปรับ index เพราะ array สั้นลง
}
// deletable = true ถ้าตัวถัดไปเท่ากับตัวปัจจุบัน
return comp(arr, len + 1, arr[len] === arr[len + 1]);
}
return;
};
comp(arr);
console.log(arr);
การทำงาน
len= index ปัจจุบันdeletable= flag ว่าตัวปัจจุบันซ้ำกับตัวก่อนหรือไม่- ถ้า
deletable→spliceลบตัวปัจจุบัน และlen--ชดเชย - ส่ง
arr[len] === arr[len+1]เป็นdeletableสำหรับรอบถัดไป
ผลลัพธ์
[ 17, 12, 354, 1 ]
ข้อควรระวัง: Recursion depth = array length อาจ stack overflow กับอาร์เรย์ใหญ่