JavaScript - 确定从序列中删除一组值的所有可能方法
javascriptweb developmentfront end technologyobject oriented programming更新于 2024/1/3 11:24:17
我们需要编写一个 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
相关文章
有用资源
javascript 参考教程 - 该教程包含有关 javascript 的更多信息:https://www.cainiaomax.com/javascript/

