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

JavaScript - กำหนดวิธีที่เป็นไปได้ทั้งหมดที่กลุ่มของค่าสามารถลบออกจากลำดับได้


เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่กำหนดจำนวนวิธีต่างๆ ที่เราสามารถลบกลุ่มของค่าออกจากลำดับ โดยปล่อยให้ลำดับเดิมอยู่ในลำดับ (เสถียร) และทำให้แน่ใจว่าได้ลบค่าอินสแตนซ์แต่ละค่าออกจากลำดับเดิมเพียงค่าเดียว

ตัวอย่างเช่น − หากอาร์เรย์ลำดับคือ −

const arr = [1, 2, 1, 3, 1, 4, 4];

และอาร์เรย์ที่จะลบคือ −

const arr2 = [1, 4, 4];

จากนั้นมีสามวิธีในการทำเช่นนี้โดยไม่กระทบต่อลำดับขององค์ประกอบ −

1 --> [2, 1, 3, 1]
2 --> [1, 2, 3, 1]
3 --> [1, 2, 1, 3]

ดังนั้น ฟังก์ชันของเราควรเอาท์พุต 3 สำหรับลำดับเหล่านี้ รหัสสำหรับสิ่งนี้จะเป็น −

ตัวอย่าง

const arr = [1, 2, 1, 3, 1, 4, 4];
const arr2 = [1, 4, 4];
const possibleRemovalCombinations = (original, part) => {
   const sorter = (a, b) => a - b;
   part.sort(sorter);
   let place = [];
   part.forEach(el => {
      place[el] = []
   });
   original.forEach((el, index) => {
      if(place[el]){
         place[el].push(index);
      }
   });
   let connection = part.map(el => place[el].slice());
   for(let i = 1; i < connection.length; i++){
      if (part[i - 1] != part[i]){
         continue;
      }
      let left = connection[i - 1][0];
      while(connection[i][0] <= left){
         connection[i].shift();
      };
   };
   for (let i = connection.length - 2; i >= 0; i--) {
      if(part[i] != part[i + 1]){
         continue;
      }
      let right = connection[i + 1][connection[i + 1].length - 1];
      while(connection[i][connection[i].length - 1] >= right){
         connection[i].pop();
      };
   };
   const combineArray = (step, prev, combination) => {
      for (let i = 0; i < connection[step].length; i++) {
         let curr = connection[step][i];
         if(prev >= curr && original[prev] == original[curr]){
            continue;
         }
         if(step + 1 == connection.length){
            combinations.push(combination.concat([curr]))
         }
         else {
            combineArray(step + 1, curr, combination.concat([curr]));
         };
      };
   };
   let combinations = [], res = [];
   combineArray(0, -1, []);
   for (let i = 0; i < combinations.length; i++) {
      let copy = original.slice();
      combinations[i].forEach(el => copy[el]);
      res[i] = copy.filter(el => el !== undefined);
   };
   return res.length;
};
console.log(possibleRemovalCombinations(arr, arr2));

ผลลัพธ์

และผลลัพธ์ในคอนโซลจะเป็น −

3