返回

彻底搞定!轻松手写出数组扁平化 flat(),从此面试无忧

前端

前言

数组扁平化是面试中经常遇到的一个问题,虽然看起来很简单,但很多同学还是会被卡住。本文将详细介绍如何手写数组扁平化函数 flat(),包括使用递归和迭代两种方法。此外,还将提供一些额外的技巧,帮助您在面试中脱颖而出。

正文

递归法

递归法是解决数组扁平化问题最直接的方法。思路是:

  1. 如果数组元素不是数组,则直接返回该元素。
  2. 如果数组元素是数组,则递归调用 flat() 函数处理该数组,然后将结果与其他元素合并成一个新的数组。
function flat(arr) {
  let result = [];

  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      result = result.concat(flat(arr[i]));
    } else {
      result.push(arr[i]);
    }
  }

  return result;
}

迭代法

迭代法也是解决数组扁平化问题的一种常见方法。思路是:

  1. 将数组元素压入栈中。
  2. 循环弹出栈顶元素,如果该元素不是数组,则将其压入结果数组。
  3. 如果该元素是数组,则将该数组的元素压入栈中。
  4. 重复步骤 2 和步骤 3,直到栈为空。
function flat(arr) {
  let result = [];
  let stack = arr.slice();

  while (stack.length) {
    let item = stack.pop();

    if (!Array.isArray(item)) {
      result.push(item);
    } else {
      stack = stack.concat(item);
    }
  }

  return result;
}

额外技巧

  1. 在面试中,您可能会被要求在特定时间内完成数组扁平化。为了提高速度,您可以使用一些技巧,例如:

    • 预先分配结果数组的大小。
    • 使用尾递归优化来消除递归函数的栈调用开销。
    • 使用正则表达式来检测数组元素是否为数字。
  2. 您还可能会被要求实现一个通用的扁平化函数,该函数可以处理任意深度的嵌套数组。为了实现这一点,您可以使用递归或迭代方法,并使用一个参数来指定要扁平化的深度。

结语

数组扁平化是一个常见的算法问题,也是面试中经常遇到的一个问题。通过本文的学习,您应该已经掌握了如何手写数组扁平化函数 flat()。在面试中,您需要做的就是保持冷静,并根据自己的情况选择合适的方法来解决问题。