力扣刷题:嵌套数组生成器

100 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。

问题:

现给定一个整数的 多维数组 ,请你返回一个生成器对象,按照 中序遍历 的顺序逐个生成整数。

多维数组 是一个递归数据结构,包含整数和其他 多维数组。

中序遍历 是从左到右遍历每个数组,在遇到任何整数时生成它,遇到任何数组时递归应用 中序遍历 。

示例:(放代码里面)

输入: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

思路:

这段代码定义了一个名为 inorderTraversal 的生成器函数,它接受一个多维数组作为输入。

在函数内部,使用 for...of 循环遍历输入数组的每个元素。对于每个元素,使用 Array.isArray 方法检查它是否为数组。

  • 如果元素是数组,则递归调用inorderTraversal 函数,并使用 yield* 语句将返回的生成器对象委托给当前生成器对象。这样,当遍历当前生成器对象时,也会遍历返回的生成器对象。
  • 如果元素不是数组,则使用 yield 语句将其作为生成器对象的下一个值。

这样,当遍历生成器对象时,会按照中序遍历的顺序逐个生成整数。

基于上述思考,代码如下:

var inorderTraversal = function*(arr) {
    for (const item of arr) {
        if (Array.isArray(item)) {
            yield* inorderTraversal(item);
        } else {
            yield item;
        }
    }
};

执行结果如下图:

image-20230618001556754.png

通过这个题,我们可以学到以下知识点:

  1. 生成器函数:生成器函数是一种特殊的函数,它可以返回一个生成器对象。生成器对象可以按顺序生成一系列值,而不是一次性返回所有值。生成器函数使用 function* 关键字定义。
  2. yield 语句:yield 语句用于在生成器函数中定义生成器对象的值。每次调用生成器对象的 next 方法时,都会返回 yield 语句后面的值。
  3. 递归:递归是一种编程技巧,它允许函数调用自身。递归通常用于解决可以分解为相似子问题的问题。
  4. 中序遍历:中序遍历是一种遍历多维数组的方法。它从左到右遍历每个数组,在遇到任何整数时生成它,遇到任何数组时递归应用中序遍历。