数组的扁平化
请编写一个函数,它接收一个 多维数组 arr 和它的深度 n ,并返回该数组的 扁平化 后的结果。
多维数组 是一种包含整数或其他 多维数组 的递归数据结构。
数组 扁平化 是对数组的一种操作,定义是将原数组部分或全部子数组删除,并替换为该子数组中的实际元素。只有当嵌套的数组深度大于 n 时,才应该执行扁平化操作。第一层数组中元素的深度被认为是 0。
const arr = [1,2,3,[6],[7,8,[9,10,[1,2],11],12],[13,14,15]]
const flat = (arr, n) => {
if (n <= 0) {
return arr;
}
const result = [];
for (let i = 0; i < arr.length; i++) {
result.push(...(Array.isArray(arr[i]) ? flat(arr[i], n - 1) : [arr[i]]));
}
return result;
};
BFS
可以利用concat的特性,循环次数为深度,但是some和展开concat都稍慢于广度优先的一层层拍平方案
const flat = function (arr, n) {
while (n > 0 && arr.some(Array.isArray)) {
arr = [].concat(...arr);
n--;
}
return arr;
};
DFS
广度优先的话需要每次都判断数组内是否还有嵌套数组,深度的话就是自己模拟栈即可,如果每一层栈都立刻处理,当前栈没有新增栈的话则弹出,稍快一点
const flat = function (arr, n = 0) {
if (n <= 0) {
return arr;
}
const result = [];
const stack = []; // 栈变量,一层层存入
for (let i = 0; i < arr.length; i++) {
const current = arr[i];
if (Array.isArray(current)) {
stack.push(current);
while (stack.length) {
const last = stack[stack.length - 1]; // 获取当前最深的栈
let deeper = false;
while (last.length) {
const c = last.shift();
if (Array.isArray(c) && n > stack.length) {
stack.push(c); // 增加栈深度
deeper = true;
break;
} else {
result.push(c);
}
}
if (!deeper) { // 如果本层拍平没有增加深度则弹出
stack.pop();
}
}
} else {
result.push(current);
}
}
return result;
};

浙公网安备 33010602011771号