2625.扁平化嵌套数组 TypeScript

题目
请你编写一个函数,它接收一个 多维数组 arr 和它的深度 n ,并返回该数组的 扁平化 后的结果。

多维数组 是一种包含整数或其他 多维数组 的递归数据结构。

数组 扁平化 是对数组的一种操作,定义是将原数组部分或全部子数组删除,并替换为该子数组中的实际元素。只有当嵌套的数组深度大于 n 时,才应该执行扁平化操作。第一层数组中元素的深度被认为是 0。

请在没有使用内置方法 Array.flat 的前提下解决这个问题。

示例 1:

输入
arr = [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]]
n = 0
输出
[1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]]

解释
传递深度 n=0 的多维数组将始终得到原始数组。这是因为 子数组(0) 的最小可能的深度不小于 n=0 。因此,任何子数组都不应该被平面化。
示例 2:

输入
arr = [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]]
n = 1
输出
[1, 2, 3, 4, 5, 6, 7, 8, [9, 10, 11], 12, 13, 14, 15]

解释
以 4 、7 和 13 开头的子数组都被扁平化了,这是因为它们的深度为 0 , 而 0 小于 1 。然而 [9,10,11] 其深度为 1 ,所以未被扁平化。
示例 3:

输入
arr = [[1, 2, 3], [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]]
n = 2
输出
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

解释
所有子数组的最大深度都为 1 。因此,它们都被扁平化了。

提示:

0 <= arr 的元素个数 <= 105
0 <= arr 的子数组个数 <= 105
maxDepth <= 1000
-1000 <= each number <= 1000
0 <= n <= 1000


递归解法

type MultiDimensionalArray = (number | MultiDimensionalArray)[];

const flat = function (arr:  MultiDimensionalArray, n: number):  MultiDimensionalArray {
    let res:MultiDimensionalArray = [];

    const flattening = (nums:MultiDimensionalArray,l:number)=>{
        for(const num of nums){
            if(Array.isArray(num) && l>0 ){
                flattening(num as MultiDimensionalArray, l-1);
            }else{
                res.push(num);
            }
        }
    }

    flattening(arr, n);
    return res;
};

解题

type MultiDimensionalArray = (number | MultiDimensionalArray)[];

MultiDimensionalArray 类型定义了一个可以包含数字或数字的嵌套数组。


let res:MultiDimensionalArray = [];

res是用来储存扁平化结果的容器。



    const flattening = (nums:MultiDimensionalArray,l:number)=>{
        for(const num of nums){
            if(Array.isArray(num) && l>0 ){
                flattening(num as MultiDimensionalArray, l-1);
            }else{
                res.push(num);
            }
        }
    }

这一段是这段代码的核心部分,运用了递归的思想,递归相对来说比较抽象,举个例子易于理解。

const arr: MultiDimensionalArray = [1, [2, [3, 4]], [5, 6]];
console.log(flat(arr, 1));

假设要将上面的数组进行扁平化处理,传入的l是1。
【第一遍】for循环,找到arr第一个元素1,他不是数组,丢进res容器中。此时res = [1]
【第二遍】for循环,找到arr第二个元素[2,[3,4]],他是一个数组,且此时l为1>0,所以将l-1=0后,将[2,[3,4]]作为一个新的数组作为参数nums。对该数组进行for循环,由于此时l已经为0,所以[2,[3,4]]的每个元素都会被丢到容器res中,此时res = [1,2,[3,4]]
【第三遍】for循环,找到arr第三个元素[5,6],他是一个数组,且此时l=1>0,所以该数组会作为一个新的参数nums进行for循环,此时l=0,所以数组中的所有元素都会被丢进res容器。此时res = [1,2,[3,4],5,6]。


有的人可能不理解该题深度n和如何扁平化之间的关系,在我看来像数组
[1, [2, [3, 4]], [5, 6]],如果传入n=1,那么就会该数组中每个元素进行检查,如果该元素是数组,那么就将它扁平化,去掉他的[],得到结果[1, 2, [3, 4], 5, 6]。如果传入n=2,那么就会对该数组进行两遍检查,也就是在进行一遍检查后的[1,2,[3,4],5,6]上对其每个元素进行检查,对是数组的元素进行扁平化,去掉他们的[],结果是[1, 2, 3, 4, 5, 6]

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值