说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
现给定一个整数的 多维数组 ,请你返回一个生成器对象,按照 中序遍历 的顺序逐个生成整数。
多维数组 是一个递归数据结构,包含整数和其他 多维数组。
中序遍历 是从左到右遍历每个数组,在遇到任何整数时生成它,遇到任何数组时递归应用 中序遍历 。
示例 1:
输入:arr = [[[6]],[1,3],[]] 输出:[6,1,3] 解释: const generator = inorderTraversal(arr); generator.next().value; // 6 generator.next().value; // 1 generator.next().value; // 3 generator.next().done; // true
示例 2:
输入:arr = [] 输出:[] 解释:输入的多维数组没有任何参数,所以生成器不需要生成任何值。
提示:
- 0 <= arr.flat().length <= 10^5
- 0 <= arr.flat()[i] <= 10^5
- maxNestingDepth <= 10^5
解题思路
先使用 Array.prototype.flat() 方法将嵌套的数组扁平化成一维数组。然后,使用 for…of 循环遍历扁平化后的数组中的每个元素,并通过 yield 关键字将其返回给生成器。
由于函数返回的是一个生成器对象,而不是一个普通的数组,因此在需要使用生成器的场合,可以使用 inorderTraversal 函数来生成一个迭代器,通过调用 next() 方法逐个获取生成器返回的值。
需要注意的是,由于该函数没有对原始数组进行任何修改,因此即使输入的数组是多重嵌套的,最终返回的序列也将是一维的,即所有值都是相邻的,没有层级关系。如果需要按照树形结构遍历多维数组,需要使用递归算法或其他层级遍历算法。
AC代码
/** * @param {Array} arr * @return {Generator} */ var inorderTraversal = function*(arr) { arr = arr.flat(); for(const item of arr){ yield item; } };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。