首页 > 其他分享 >数组的扁平化

数组的扁平化

时间:2023-06-14 21:13:32浏览次数:41  
标签:arr const 扁平化 result 数组 深度

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

  

标签:arr,const,扁平化,result,数组,深度
From: https://www.cnblogs.com/lxl0419/p/17481342.html

相关文章

  • 有效的山脉数组
    给定一个整数数组arr,如果它是有效的山脉数组就返回 true,否则返回false。让我们回顾一下,如果arr 满足下述条件,那么它是一个山脉数组:arr.length>=3在 0<i <arr.length-1 条件下,存在 i 使得:arr[0]<arr[1]<...arr[i-1]<arr[i]arr[i]>arr[i+1]>...>......
  • 每日一道leetcode:4. 寻找两个正序数组的中位数
    1.题目(困难)题目链接给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例2:输入:nums1=[1,2],nu......
  • 【数据结构与算法面试题】子数组的最大和
    题目来源“数据结构与算法面试题80道”。问题分析:在数组的每一个位置处保存当前的最大值,当前的最大值组成为:解决方案:intget_max_subarray(int*a,intlength,bool&is_array_ok){ if(NULL==a||length<=0){ is_array_ok=false; return0; } int*p_h_a=(int*......
  • 92 面向对象 商品(多个属性)放入3个数组中
    对象packagecom.fqs.goods;publicclassGoods{privateintid;privateStringname;privatedoubleprice;privateintgeShu;publicGoods(){}publicGoods(intid,Stringname,doubleprice,intgeShu){this.id=......
  • 后缀数组
    后缀树和后缀数组讲解:https://blog.csdn.net/weixin_30790841/article/details/96620579?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1https://blog.csdn.net/......
  • C# 获取数组排序后的下标
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApp9{classProgram{staticvoidMain(string[]args){int[]src=newint[]{2,1......
  • JavaScript中数组(Array)与对象(Object)中的检索方式
    这里只是要说明一点,数组(Array)和对象(Object)都可以用[...]的方式来进行检索[...]中包含的需要是一个表达式,这个表达式的值最终会以字符串的形式被使用因为不论是数组(Array)还是对象(Object),他们都是以键值对的形式存储内容的,而所有的键的数据类型都是字符串(Array好像不是,但是先这样......
  • java开发C语言解释器:数组元素的读取和赋值
    本节技术内容难度较大,请结合视频对代码的讲解和调试来理解本节内容:用java开发编译器一个成熟的编译器或解释器,要能够解析和执行目标语言开发的逻辑复杂的程序代码,我们用java开发的C语言解释器,能够执行用C语言开发的较为复杂的程序时,才称得上是合格的,从本节开始,我们致力于C语言解......
  • 面试算法:在整形数组中构建元素之和能整除数组长度的子集
    更详细的讲解和代码调试演示过程,请参看视频如何进入google,算法面试技能全面提升指南假设A是一个整数数组,长度为n,数组中的元素可能是重复的。设计一个算法,找到一系列下标的集合I={i(0),i(1),i(2)….i(n)}.使得(A[i(0)]+A[i(1)]+…A[i(n)])modn=0.例如假定A={711......
  • 面试算法:波浪型数组的快速排序法
    波浪型数组是具备这样特性的数组,它的元素先是递增,到达某个点后开始低贱,接着达到某个点时又递增,接着右递减,以下数组就是一个波浪型数组:A:57,131,493,294,221,339,418,452,442,190A[0]A[1]A[2]A[3]A[4]A[5]A[6],A[7],A[8],A[9]不难发现,A[0]-A[4]是一个波浪,因为......