数组的扁平化

请编写一个函数,它接收一个 多维数组 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;
};

  

posted @ 2023-06-14 20:57  夏目友人喵  阅读(14)  评论(0编辑  收藏  举报