【前端面试】list转树、拍平, 指标,

news2024/12/18 20:02:12

这个题目涉及的是将一组具有父子关系的扁平数据转换为树形结构,通常称为“树形结构的构建”问题。类似的题目包括:

1. 组织架构转换

给定一个公司的员工列表,每个员工有 idmanagerId,其中 managerId 表示该员工的上级。任务是将这个员工列表转换为一个树形的组织架构。

示例:

const employees = [
    { id: 1, name: 'CEO', managerId: null },
    { id: 2, name: 'CTO', managerId: 1 },
    { id: 3, name: 'Engineer 1', managerId: 2 },
    { id: 4, name: 'Engineer 2', managerId: 2 },
    { id: 5, name: 'CFO', managerId: 1 },
    { id: 6, name: 'Accountant', managerId: 5 }
];

目标: 将这些数据转换为组织架构树。

const ROOT_MANAGER_ID = null;

function buildOrgChart(employees) {
    const map = new Map();
    let roots = [];

    employees.forEach((employee) => {
        map.set(employee.id, { ...employee, subordinates: [] });
    });

    employees.forEach((employee) => {
        const currentEmployee = map.get(employee.id);
        const managerId = employee.managerId;

        if (managerId === ROOT_MANAGER_ID) {
            roots.push(currentEmployee); // 如果没有经理,就认为是根节点
        } else {
            const manager = map.get(managerId);
            if (manager) {
                manager.subordinates.push(currentEmployee); // 将下属添加到经理的子节点数组
            } else {
                console.error(`Invalid managerId ${managerId} for employee with id ${employee.id}`);
            }
        }
    });

    return roots;
}

const orgChart = buildOrgChart(employees);
console.log(JSON.stringify(orgChart, null, 2));

2. 文件夹和文件结构

给定一个文件夹和文件列表,每个文件或文件夹有 idnameparentId,表示文件夹和文件之间的层级关系,任务是构建文件夹和文件的层级树。

示例:

const items = [
    { id: 1, name: 'root', parentId: null },
    { id: 2, name: 'Folder 1', parentId: 1 },
    { id: 3, name: 'File 1', parentId: 2 },
    { id: 4, name: 'File 2', parentId: 2 },
    { id: 5, name: 'Folder 2', parentId: 1 },
    { id: 6, name: 'File 3', parentId: 5 }
];

目标: 将文件夹和文件转换为树形结构。

const ROOT_PARENT_ID = null;

function buildFileStructure(items) {
    const map = new Map();
    let roots = [];

    items.forEach((item) => {
        map.set(item.id, { ...item, children: [] });
    });

    items.forEach((item) => {
        const currentItem = map.get(item.id);
        const parentId = item.parentId;

        if (parentId === ROOT_PARENT_ID) {
            roots.push(currentItem); // 如果没有父文件夹,则认为是根文件夹
        } else {
            const parent = map.get(parentId);
            if (parent) {
                parent.children.push(currentItem); // 将当前文件或文件夹添加到父节点的 children 数组
            } else {
                console.error(`Invalid parentId ${parentId} for item with id ${item.id}`);
            }
        }
    });

    return roots;
}

const fileStructure = buildFileStructure(items);
console.log(JSON.stringify(fileStructure, null, 2));

3. 评论/回复树

给定一组评论数据,其中每个评论包含 idparentIdcontent,任务是将这些评论转换为树形结构,其中 parentId 为 null 或 0 表示根评论。

示例:

const comments = [
    { id: 1, parentId: null, content: 'First comment' },
    { id: 2, parentId: 1, content: 'Reply to first comment' },
    { id: 3, parentId: 1, content: 'Another reply to first comment' },
    { id: 4, parentId: 2, content: 'Reply to reply' }
];

目标: 将评论转换为树形结构。

const ROOT_PARENT_ID = null;

function buildCommentTree(comments) {
    const map = new Map();
    let roots = [];

    comments.forEach((comment) => {
        map.set(comment.id, { ...comment, replies: [] });
    });

    comments.forEach((comment) => {
        const currentComment = map.get(comment.id);
        const parentId = comment.parentId;

        if (parentId === ROOT_PARENT_ID) {
            roots.push(currentComment); // 如果没有父评论,则认为是根评论
        } else {
            const parent = map.get(parentId);
            if (parent) {
                parent.replies.push(currentComment); // 将当前评论添加到其父评论的 replies 数组
            } else {
                console.error(`Invalid parentId ${parentId} for comment with id ${comment.id}`);
            }
        }
    });

    return roots;
}

const commentTree = buildCommentTree(comments);
console.log(JSON.stringify(commentTree, null, 2));

4. 分类树

给定商品分类列表,其中每个分类有 idparentIdname,任务是将这些分类转换为树形结构。

示例:

const categories = [
    { id: 1, name: 'Electronics', parentId: null },
    { id: 2, name: 'Computers', parentId: 1 },
    { id: 3, name: 'Laptops', parentId: 2 },
    { id: 4, name: 'Smartphones', parentId: 1 }
];

目标: 将分类列表转换为树形结构。

const ROOT_PARENT_ID = null;

function buildCategoryTree(categories) {
    const map = new Map();
    let roots = [];

    categories.forEach((category) => {
        map.set(category.id, { ...category, subcategories: [] });
    });

    categories.forEach((category) => {
        const currentCategory = map.get(category.id);
        const parentId = category.parentId;

        if (parentId === ROOT_PARENT_ID) {
            roots.push(currentCategory); // 根分类
        } else {
            const parent = map.get(parentId);
            if (parent) {
                parent.subcategories.push(currentCategory); // 添加子分类
            } else {
                console.error(`Invalid parentId ${parentId} for category with id ${category.id}`);
            }
        }
    });

    return roots;
}

const categoryTree = buildCategoryTree(categories);
console.log(JSON.stringify(categoryTree, null, 2));

这些题目都涉及构建树形结构,核心的思想是遍历节点,将每个节点的父子关系映射到树形结构上,通常会用到哈希表(如 Map)来缓存节点,以避免多次查找。

评定指标

性能方面

  • 加载性能:通过工具测量 FCP(首次内容绘制)和 LCP(最大内容绘制)指标,理想的 FCP 应在1.8秒内,LCP 应在2.5秒内。TTFB(首字节时间)也很关键,其理想时间应在800毫秒内,该指标反映了服务器响应速度及网络传输等综合情况.
  • 交互性能:FID(首次输入延迟)测量用户首次交互到浏览器响应的时间,应在100毫秒内响应用户输入。TBT(总阻塞时间)反映长任务对主线程的阻塞情况,移动设备上应低于300毫秒,桌面 Web 上应低于100毫秒.
  • 渲染性能:动画或滚动需在10毫秒内生成每一帧,以保证视觉平滑。可查看页面在滚动、切换等交互时的动画效果是否流畅.
  • 资源优化:查看页面的 HTTP 请求数量和资源大小,合理减少请求数量、压缩资源文件,如压缩 CSS、JavaScript 和图片等,可加快页面加载速度.

稳定性方面

  • 页面布局稳定性:CLS(累积布局偏移)用于衡量页面布局在加载过程中的变化情况,其值应控制在0.1以内,以确保用户浏览时页面元素不会出现意外的大幅移动.
  • 兼容性:检查页面在不同浏览器、不同设备及不同屏幕分辨率下的显示和交互是否正常,确保网站的兼容性,提高用户体验的一致性。
  • 错误处理:查看控制台是否有 JavaScript 错误、资源加载失败等问题,若有则会影响页面的正常功能和稳定性,需及时修复。
  • 性能的一致性:在不同的网络环境下,如宽带、4G、5G 等,页面的性能表现应相对稳定,不会出现因网络波动而导致页面长时间无法加载或频繁出错的情况 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从构想到实现:EasyOne 多模态 AI 产品开发历程

在人工智能技术飞速发展的今天,智能产品和服务已经从单一的应用向多模态智能系统进化。随着大语言模型、计算机视觉、语音识别等领域的突破,开发集成多种 AI 技术的平台变得日益重要。为此,我们开发了 EasyOne,一个全新的 AI 多模…

游戏引擎学习第43天

仓库 https://gitee.com/mrxiao_com/2d_game 介绍运动方程 今天我们将更进一步,探索运动方程,了解真实世界中的物理,并调整它们,以创建一种让玩家感觉愉悦的控制体验。这并不是在做一个完美的物理模拟,而是找到最有趣…

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程,必须以管理员身份运行此实时调试器。是否调试该进程?

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程,必须以管理员身份运行此实时调试器。是否调试该进程? 目录一、前言二、具体原因三、解决方法 目录 报错截图 一、前言 进行应用程序开发时,需要对w3wp进行附加调试等场景&#xff…

idea无法识别文件,如何把floder文件恢复成model

前景: 昨天,我在之前的A1214模块包下新增了一个demo类,然后又新建了一个A1216模块,写了算法题,后面打算用git提交,发现之前的A1214模块下的demo类和新建的模块源文件都已经被追踪了,都是绿色的&…

2024三掌柜赠书活动第三十六期:深度学习高手笔记系列

目录 前言 理解深度学习基础 数据预处理技巧 关于《深度学习高手笔记》 编辑推荐 内容简介 作者简介 图书目录 媒体评论 《深度学习高手笔记》全书速览 结束语 前言 不用多讲,近两年的技术圈关于AI相关的技术讨论层出不穷,而深度学习作为人工…

【技术干货】移动SDK安全风险及应对策略

移动SDK(软件开发工具包)已经成为应用开发中不可或缺的一部分。通过SDK,开发者能够快速集成分析、广告调度、音视频处理、社交功能和用户身份验证等常见功能,而无需从零开始构建。这不仅能节省时间和资源,还能提高开发…

【一文概述】常见的几种内外网数据交换方案介绍

一、内外网数据交换的核心需求 内外网数据交换的需求核心在于“安全、效率、合规”,而应用场景的多样性使得不同企业需要定制化的解决方案。通过结合业务特性和安全等级要求,企业能够选择适合的技术方案来实现高效、安全的内外网数据交换。 1、数据安全…

【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程

文章目录 【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程前言一 、docker上部署mysql1. 拉取mysql镜像2. 创建容器3. 远程登录mysql 二 、docker上部署nginx1. 拉取nginx镜像2. 在dockerTar目录下 上传nginx.tar rz命令3. 创建nginx容器4…

Pytorch | 从零构建Vgg对CIFAR10进行分类

Pytorch | 从零构建Vgg对CIFAR10进行分类 CIFAR10数据集Vgg网络结构特点性能应用影响 Vgg结构代码详解结构代码代码详解特征提取层 _make_layers前向传播 forward 训练和测试训练代码train.py测试代码test.py训练过程和测试结果 代码汇总vgg.pytrain.pytest.py 前面文章我们构建…

实战 | 某院校小程序记录

更多大厂面试经验的视频分享看主页和专栏 目录: 前言: 渗透思路 1.绕过前端 2.信息泄露 3.爆破用户账号密码 4.信息泄露2 结束 前言: 遇到一个学校小程序的站点,只在前端登录口做了校验,后端没有任何校验&#x…

k8s kubernetes

文章目录 CGroupk8s运行时k8s组件k8s组件安装kubeadm命令kubectl命令k8s官网代码 CGroup 在 Linux 上,控制组(CGroup)用于限制分配给进程的资源。kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、…

uniapp中vuex(全局共享)的应用

一、Vuex概述 1.1 官方解释 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 它采用集中式存储管理 应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化 - Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸…

React简单入门 - [Next.js项目] - 页面跳转、AntD组件、二级目录等

须知 1Next.js 官网(英文)Next.js by Vercel - The React Framework2Next.js 文档(中文)简介 | Next.js 中文文档3React官网(中文)https://react.docschina.org/learn4Ant Design组件总览组件总览 - Ant Design5tailwindcss类名大全 官网英Justify Content - TailwindCS…

【十进制整数转换为其他进制数——短除形式的贪心算法】

之前写过一篇用贪心算法计算十进制转换二进制的方法,详见:用贪心算法计算十进制数转二进制数(整数部分)_短除法求二进制-CSDN博客 经过一段时间的研究,本人又发现两个规律: 1、不仅仅十进制整数转二进制可…

企业内训|阅读行业产品运营实战训练营-某运营商数字娱乐公司

近日,TsingtaoAI公司为某运营商旗下数字娱乐公司组织的“阅读行业产品运营实战训练营”在杭州落下帷幕。此次训练营由TsingtaoAI资深互联网产品专家程靖主持。该公司的业务骨干——来自内容、市场、业务、产品与技术等跨部门核心岗位、拥有8-10年实战经验的中坚力量…

pinctrl子系统学习笔记

一、背景 cpu的gpio引脚可以复用成多个功能,如可以配置成I2C或者普通GPIO模式。配置方式一般是通过写引脚复用的配置寄存器,但是不同芯片厂商配置寄存器格式内容各不相同,设置引脚复用无法做到通用且自由的配置,只能在启动初始化…

免费开源了一个图床工具 github-spring-boot-starter

文章目录 第一步,新建一个SpringBoot项目第二步,在pom文件里面引入jar包第三步,配置你的github信息github.authorization1、进入github官网,登录账号,点击头像,选择setting2、选择[Developer Settings](htt…

JVM系列之内存区域

每日禅语 有一位年轻和尚,一心求道,多年苦修参禅,但一直没有开悟。有一天,他打听到深山中有一古寺,住持和尚修炼圆通,是得道高僧。于是,年轻和尚打点行装,跋山涉水,千辛万…

自动驾驶AVM环视算法--python版本的俯视碗型投影模式

c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--3D碗型投影模式的exe测试工具》本文档进用于展示部分代码的视线,获取方式网盘自行获取(非免费介意勿下载):链接: https://pan.baidu.com/s/1STjUd87_5wDk_C…

【并发容器】源码级ConcurrentHashMap详解(java78)

1. ConcurrentHashMap 为什么要使用ConcurrentHashmap 在多线程的情况下,使用HashMap是线程不安全的。另外可以使用Hashtable,其是线程安全的,但是Hashtable的运行效率很低,之所以效率低下主要是因为其实现使用了synchronized关…