JavaScript 手撕大厂面试题数组扁平化以及增加版本 plus

前言

现在的前端面试手撕题是一个必要环节,有点时候八股回答的不错但是手撕题没写出来就会让面试官印象分大减,很可能就挂了...

概念

数组的扁平化 其实就是将一个多层嵌套的数组转换为只有一层的数组

比如: 1, \[2, \[3, \[4, 5]]] => 1,2,3,4,5,6

题目

一、实现一个 flat() easy 难度

javascript 复制代码
function myFlat(arr) {
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      result = result.concat(myFlat(arr[i]));
      // res = [...res, ...myFlat(arr[i])] 这样写也可以
    } else {
      result.push(arr[i])
    }
  }
  return result
}

二、用递归实现 medium 难度

javascript 复制代码
const flat = arr => {
  let res = []
  let rStack = [...arr]
  while (rStack.length) {
    let top = rStack.shift()
    if (Array.isArray(top)) {
      rStack.unshift(...top)
    } else {
      res.push(top)
    }
  }
  return res
}

三、控制扁平化的深度 medium 难度

depth 为展平的深度 比如 1 就是将整体深度减一

javascript 复制代码
const myFlat = (arr, depth) => {
  let result = []
  for (const element of arr) {
    if (Array.isArray(element) && depth > 0) {
      result = [...result, ...myFlat(element, depth - 1)]
    } else {
      result.push(element)
    }
  }
  return result
}

四、计算嵌套数组的深度 medium 难度
类似层序遍历!

javascript 复制代码
const getDepth = arr => {
  const queue = [...arr]
  let depth = 1
  while (queue.length > 0) {
    const curLen = queue.length
    for (let i = 0; i < curLen; i++) {
      const cur = queue.shift()
      if (Array.isArray(cur)) {
        queue.push(...cur)
      }
    }
    depth++
  }
  return depth - 1
}

五、递归控制扁平化的深度 hard 难度

javascript 复制代码
function flattenArrayWithDepth(arr, depth) {
  const flattenedArray = [];
  const queue = [{ array: arr, remainingDepth: depth }];
  while (queue.length > 0) {
    const { array, remainingDepth } = queue.shift();
    for (const item of array) {
      if (Array.isArray(item) && remainingDepth > 0) {
        queue.push({ array: item, remainingDepth: remainingDepth - 1 });
      } else {
        flattenedArray.push(item);
      }
    }
  }
  return flattenedArray;
}
相关推荐
lichenyang45322 分钟前
让 VK 小程序调用 HarmonyOS 原生能力:一次跨端 Bridge SDK 的设计与实践
前端
阳光宅男@李光熠30 分钟前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库
边境悍匪1 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
我的xiaodoujiao1 小时前
Django 基础知识详细图文教程 9-Django 模板引擎 2
开发语言·数据库·后端·django
菜鸟~noob2331 小时前
【太空电子战】从CCS到Meadowlands:反通信系统的二十年演进史【含matlab代码】
开发语言·matlab
南雨北斗1 小时前
vue3项目中的env.d.ts文件
前端
烈风逍遥1 小时前
第五篇:通用 LLM 流式对话:前后端联接的完整实现
前端·后端·架构
aixingpan1 小时前
aixingpan.cn API开发文档:api_docs_trichart_natal_progression_sec_transit2接口指南
前端·php
江华森1 小时前
Web 安全实战:验证机制、会话管理、SQL 注入、XSS 与 CSRF
前端
江华森1 小时前
HTTPS 实战:TLS 握手成本、自制 CA 与证书、三大常见故障
前端