前端面试基础算法及设计模式

一、前端常见基础算法及回答思路

1. 数组/字符串处理

两数之和
问题:在数组中找出两数之和等于目标值的索引。
解法:使用哈希表存储差值,时间复杂度O(n)。

const twoSum = (nums, target) => {const map = new Map();for (let i = 0; i < nums.length; i++) {const complement = target - nums[i];if (map.has(complement)) return [map.get(complement), i];map.set(nums[i], i);}
};

最长无重复子串
问题:求字符串中最长不重复子串的长度。
解法:滑动窗口+哈希表,记录字符最近出现的位置。

2. DOM遍历

深度优先遍历(DFS)
问题:遍历DOM树并返回所有标签名。
解法:递归遍历子节点,适用于菜单树、组件嵌套等场景。

function dfs(node, result = []) {result.push(node.tagName);for (const child of node.children) dfs(child, result);return result;
}

广度优先遍历(BFS)
解法:使用队列逐层遍历,常用于按层级处理节点。

function bfs(root) {const queue = [root], result = [];while (queue.length) {const node = queue.shift();result.push(node.tagName);queue.push(...node.children);}return result;
}

3. 排序与搜索

快速排序
解法:分治思想,时间复杂度O(n log n)。

const quickSort = (arr) => {if (arr.length <= 1) return arr;const pivot = arr.pop();const left = arr.filter(x => x <= pivot);const right = arr.filter(x => x > pivot);return [...quickSort(left), pivot, ...quickSort(right)];
};

二分查找
问题:在有序数组中快速定位目标值。
解法:双指针缩小范围,时间复杂度O(log n)。

4. 动态规划与贪心算法

爬楼梯问题
问题:每次爬1或2阶,到第n阶有多少种方法?
解法:动态规划,状态转移方程为dp[i] = dp[i-1] + dp[i-2]

const climbStairs = (n) => {let [a, b] = [1, 1];for (let i = 2; i <= n; i++) [a, b] = [b, a + b];return b;
};

买卖股票的最佳时机
解法:贪心算法,维护最小买入价和最大利润。


二、设计模式及回答思路

1. 单例模式(Singleton)

应用场景:全局状态管理(如Redux Store)、浏览器缓存对象。
回答示例

const Singleton = (function () {let instance;function createInstance() { return { /* 配置或状态 */ }; }return { getInstance: () => instance || (instance = createInstance()) };
})();

2. 工厂模式(Factory)

应用场景:动态创建组件(如React组件库)、配置对象生成。
示例

function createButton(type) {switch (type) {case 'primary': return new PrimaryButton();case 'secondary': return new SecondaryButton();default: throw new Error('Invalid type');}
}

3. 观察者模式(Observer)

应用场景:事件监听(如DOM事件)、状态管理(如Vue响应式系统)。
核心:解耦发布者与订阅者,通过事件触发更新。

4. 代理模式(Proxy)

应用场景:图片懒加载、API请求拦截(如Axios拦截器)。
示例

const proxyImage = (src) => ({load: () => {const img = new Image();img.src = src;img.onload = () => console.log('Image loaded');}
});

5. 装饰者模式(Decorator)

应用场景:高阶组件(HOC)、日志记录、权限校验。
示例

function withLogger(Component) {return function WrappedComponent(props) {console.log('Rendered:', Component.name);return <Component {...props} />;};
}

6. 策略模式(Strategy)

应用场景:表单验证(不同字段不同校验规则)、动画缓动函数。
核心:将算法封装成独立策略类,动态切换。


三、回答技巧

  1. 复杂度分析:明确时间/空间复杂度,如哈希表查询为O(1),递归需注意栈溢出。
  2. 边界处理:考虑空输入、极端值(如数组长度为0或1)。
  3. 前端结合点
    • DOM操作优化(如虚拟DOM差异算法)。
    • 实际场景举例(如防抖/节流用于搜索框)。
  4. 设计模式回答
    举例实际项目:如单例模式用于全局配置管理。
    优缺点对比:如工厂模式扩展性强但可能增加类数量。

总结

算法重点:数组/字符串处理、排序、动态规划、树遍历。
设计模式重点:单例、工厂、观察者、代理。
面试策略:结合前端特性(如DOM操作、性能优化)展开,避免纯理论回答。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小区楼道电动车监控识别预警系统

楼道电动车监控识别预警系统采用机器视觉图像感知技术,通过人工智能机器深度学习能力,对自行车、电动车和摩托车精确检测、跟踪、识别,实现对非机动车检测分析识别,在机器视觉图像景中,通过非机动车识别算法建立图像模型,完成自动检测识别非机动车,并能以视觉图像智能分…

供应链管理必须要掌握的10个常用指标及计算公式详解!

供应链管理对于很多公司来说,可能是一个看不见摸不着的“幕后英雄”。但是,掌握了核心的供应链管理指标,你就能把这些“幕后工作”做到位,提升公司整体运营效率,减少成本,甚至提高客户满意度。 今天我们就来聊聊,供应链管理中最重要的10个常用指标和它们的计算公式。如果…

分享 5 个在微信中使用 DeepSeek 的方法,建议收藏!

前言 今天大姚将为大家分享5种在微信中使用DeepSeek的方法,帮助大家更好地利用这一工具,提升工作和学习效率。无论是处理文档、管理知识,还是进行深度搜索和思考,这些方法都将为你带来全新的体验。让我们一起探索DeepSeek在微信中的无限可能吧!公众号「追逐时光者」回复关…

用python制作太阳花

点击查看代码 from turtle import * color(red,yellow) begin_fill() while True:forward(200)left(170)if abs(pos())<1:break end_fill() done()

使用Acronis True Image恢复系统

在U深度PE环境中,使用Acronis True Image恢复系统。只要平常时,做好服务器或是工作端的系统备份,遇上系统崩溃或是某种原因,需要恢复时,可以参考下面方法来恢复。准备好备份xxx.tib....U深度U盘启动,进入维护环境,运行傲梅开区助手(1),查看硬盘分区情部分,如磁盘1,未…

15.7.2 微调BERT的数据集

在我们已经训练好BERT后,BERT就可以对输入的每一个词元返回抽取了上下文信息的特征向量(也就是对于任意一个词元,将这个词元当做查询,所有词元当做键值对) 一些任务如下这里将<cls>的特征向量传递给全连接层的原因就是因为<cls>本来就是用来分类的,所以肯定传…

【分享】FTP为何被摒弃,如何选择适配的国产FTP传输软件?

在数字化浪潮中,文件传输是日常工作里不可或缺的一环。提及文件传输,FTP(文件传输协议)大家都不陌生,它就像一位勤勤恳恳的老邮差,多年来一直承担着文件传输的重任。凭借着简单易用、广泛支持、兼容性好以及成本低廉的优点,FTP在全球各地广泛应用,成为许多企业和个人进…

实验1作业

四、运行结果分析 1.task 1: 代码1(1个字符小人):#include <stdio.h> int main(){printf(" O \n");printf("\n");printf("I I\n"); return 0; } 运行结果截图: 代码2(两个竖着的小人): #include <stdio.h> int main(){prin…

DeepSeek 开源周回顾「GitHub 热点速览」

上周,DeepSeek 发布的开源项目用一个词形容就是:榨干性能!由于篇幅有限,这里仅列出项目名称和简介,感兴趣的同学可以前往 DeepSeek 的开源组织页面,深入探索每个项目的精彩之处!第一天 FlashMLA:基于 Hopper GPU 的高效 MLA 解码内核 第二天 DeepEP:专为 MoE 和 EP 设…

20250304

1. 烧碱 回调2800左右 波段多

怎样配置blazor才能提高吞吐量

怎样配置blazor才能提高吞吐量 为了提高 Blazor 应用的吞吐量,可以从以下几个方面进行配置和优化:启用响应压缩:通过压缩传输的数据量来减少带宽消耗。 配置 SignalR:调整 SignalR 的配置以提高数据传输效率。 优化 Circuit 选项:调整 Blazor Server 的 Circuit 配置以提高…