【前端面试】七、算法-递归
常考算法
-
排序算法:快速排序、归并排序、堆排序等。
-
查找算法:二分查找、哈希表查找等。
-
动态规划:解决最优化问题,如斐波那契数列、最长公共子序列等。
-
图论算法:最短路径(Dijkstra、Floyd-Warshall)、拓扑排序等。
-
字符串处理:KMP算法、正则表达式匹配等。
遍历方法总结
链式调用
- 数组的很多操作可以构成链式操作,类似这样的格式:…map().filter(…).sort(…).map(….)
- 链式操作就是对象方法返回类型是自身的。比如map是属于数组的方法,它返回数组,所以构成了链式操作
- 优势:语义清晰、思考方便,数据量小的时候很有用(<1W)
- 问题:性能、空间
递归
递归通常需要初始条件和递归表达式
阶乘:n! = n x (n-1) !
斐波那契:f(1) = 1, f(2) = 1,f(n) = f(n-1) + f(n-2), n>2
拷贝
push/pop/shift/unshift/splice:都在原始数据上进行修改
concat/slice/map/reduce:都会对原始数据进行浅拷贝
DOM结点的绝对位置
offsetLeft、offsetRight相对于offsetParent的位置
Element.getBoundingClientRect()相对于视窗的位置,受滚动的影响
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>递归</title>
</head>
<body><script>// 阶乘function factorial(n) {if (n === 1) return 1return n * factorial(n - 1)}// 斐波那契数列 1 1 2 3 5 8 13 21 34 55 89 144function fibonacci(n) {if (n === 1 || n === 2) return 1return fibonacci(n - 1) + fibonacci(n - 2)}// 从底端构造递归function fibonacci1(n) {let [a,b] = [1,1]for(let i = 3; i <= n; i++) {[a,b] = [b, a + b]}return b}// console.log('测试 fibonacci1=============');// console.log(fibonacci1(10));function fibonacci2(n) {return Array(n - 2).fill(0).reduce(([a,b],_) => {return [b, a + b]}, [1,1])[1]}// console.log('测试 fibonacci2=============');// console.log(fibonacci2(10));// 递归实现深拷贝function deepClone(obj) {if (typeof obj !== 'object' || obj === null) return obj// const newObj = Array.isArray(obj) ? [] : {}// const newObj = obj instanceof Array ? [] : {}// const newObj = obj.constructor === Array ? [] : {}// const newObj = Object.prototype.toString.call([]) === '[object Array]' ? [] : {}const newObj = new obj.constructor()for(let key in obj) {if(obj.hasOwnProperty(key)) {newObj[key] = deepClone(obj[key])}}return newObj}// 测试用例 function testDeepClone() { console.log("测试普通对象:"); const obj1 = { a: 1, b: { c: 2 } }; const clonedObj1 = deepClone(obj1); console.assert(obj1 !== clonedObj1, "对象应该是不同的引用"); console.assert(obj1.b !== clonedObj1.b, "嵌套对象也应该是不同的引用"); console.assert(obj1.b.c === clonedObj1.b.c, "嵌套对象的属性值应该相等"); console.log("测试数组:"); const arr1 = [1, 2, [3, 4]]; const clonedArr1 = deepClone(arr1); console.assert(arr1 !== clonedArr1, "数组应该是不同的引用"); console.assert(arr1[2] !== clonedArr1[2], "嵌套数组也应该是不同的引用"); console.assert(arr1[2][0] === clonedArr1[2][0], "嵌套数组的元素值应该相等"); console.log("测试特殊对象(Date):"); const date1 = new Date(); const clonedDate1 = deepClone(date1); console.assert(date1 !== clonedDate1, "Date 对象应该是不同的引用"); console.assert(date1.getTime() === clonedDate1.getTime(), "Date 的时间戳应该相等"); // console.log("测试特殊对象(RegExp):"); // 失败 // const reg1 = /hello/g; // const clonedReg1 = deepClone(reg1); // console.assert(reg1 !== clonedReg1, "RegExp 对象应该是不同的引用"); // console.assert(reg1.source === clonedReg1.source && reg1.global === clonedReg1.global, "RegExp 的属性和标志应该相等"); // console.log("测试循环引用:"); // 失败 // const obj2 = {}; // obj2.self = obj2; // const clonedObj2 = deepClone(obj2); // console.assert(obj2 !== clonedObj2, "对象应该是不同的引用"); // console.assert(clonedObj2.self === clonedObj2, "循环引用应该被正确处理"); console.log("所有测试通过!"); } // testDeepClone();// 深度比较function deepCompare(a,b){if (a === null || typeof a !== 'object' || b === null || typeof b !== 'object') {return a === b}// Object.getOwnPropertyDescriptors 方法会返回对象自身的所有属性描述符,包括不可枚举的属性const propsA = Object.getOwnPropertyDescriptors(a)const propsB = Object.getOwnPropertyDescriptors(b)if(Object.keys(propsA).length !== Object.keys(propsB).length) return falsereturn Object.keys(propsA).every(key => deepCompare(a[key],b[key]))}// 测试用例 function testDeepCompare() { console.log("测试基本相等性:"); console.assert(deepCompare(1, 1), "1 应该等于 1"); console.assert(!deepCompare(1, 2), "1 不应该等于 2"); console.assert(deepCompare(null, null), "null 应该等于 null"); console.assert(deepCompare(undefined, undefined), "undefined 应该等于 undefined"); console.assert(!deepCompare(null, undefined), "null 不应该等于 undefined"); console.log("测试对象比较:"); const obj1 = { a: 1, b: { c: 2 } }; const obj2 = { a: 1, b: { c: 2 } }; const obj3 = { a: 1, b: { c: 3 } }; console.assert(deepCompare(obj1, obj2), "obj1 应该等于 obj2"); console.assert(!deepCompare(obj1, obj3), "obj1 不应该等于 obj3"); console.log("测试数组比较:"); const arr1 = [1, 2, [3, 4]]; const arr2 = [1, 2, [3, 4]]; const arr3 = [1, 2, [3, 5]]; console.assert(deepCompare(arr1, arr2), "arr1 应该等于 arr2"); console.assert(!deepCompare(arr1, arr3), "arr1 不应该等于 arr3"); // console.log("测试循环引用(此实现可能无法正确处理):"); // const obj4 = {}; // obj4.self = obj4; // const obj5 = {}; // obj5.self = obj5; // 注意:此实现可能无法正确处理循环引用,因为它会陷入无限递归 // 这里我们假设它不会处理循环引用,并跳过这个测试 // console.assert(deepCompare(obj4, obj5), "循环引用对象应该相等(但这里不测试)"); console.log("所有测试通过!"); } // testDeepCompare();// DOM节点的绝对位置function getLayout1(el) {if (!el) return;const layout = {width: el.offsetWidth,height: el.offsetHeight,top: el.offsetTop,left: el.offsetLeft}if(el.offsetParent) {const parentLayout = getLayout1(el.offsetParent)layout.top += parentLayout.toplayout.left += parentLayout.left}return layout}function getLayout2(el) {if (!el) return;let left = el.offsetLeftlet top = el.offsetToplet p = el.offsetParentwhile(p) {left += p.offsetLefttop += p.offsetTopp = p.offsetParent}return {width: el.offsetWidth,height: el.offsetHeight,top,left}}</script></body>
</html>
相关文章:
![](https://i-blog.csdnimg.cn/direct/a37c10d695274ffeb4e88b1660a5197a.png)
【前端面试】七、算法-递归
常考算法 排序算法:快速排序、归并排序、堆排序等。 查找算法:二分查找、哈希表查找等。 动态规划:解决最优化问题,如斐波那契数列、最长公共子序列等。 图论算法:最短路径(Dijkstra、Floyd-Warshall&am…...
![](https://i-blog.csdnimg.cn/direct/bc35cfc83d334437bf76c6d35f6f4dd1.png)
CmsEasy逻辑漏洞--零元购
CmsEasy逻辑漏洞--零元购 选择购买MackBook 购买成功后会员中心发现多出8100快钱 然后就可以正常购买了...
![](https://i-blog.csdnimg.cn/direct/c7d941f5c85247dfac8ab38b13076514.png)
Linux 内核源码分析---I/O 体系结构与访问设备
I/O 体系结构 与外设的通信通常称之为输入输出,一般都缩写为I/O。 在实现外设的I/O时,内核必须处理3个可能出现的问题: (1)必须根据具体的设备类型和模型,使用各种方法对硬件寻址; (…...
![](https://img-blog.csdnimg.cn/img_convert/1158f126bef4cc6e09760476b11c8fcf.png)
在cPanelWHM中如何重置 MySQL 用户帐户密码
更改MySQL用户账户密码非常简单。服务器管理员可以在WHM中编辑任何MySQL用户的帐户。cPanel用户可以编辑其帐户管理的数据库的密码。 在WHM中更改MySQL用户帐户密码 打开WHM,在侧边菜单中的SQL服务下选择“Change MySQLUser Password”。Hostease的服务器产品提供稳…...
![](https://i-blog.csdnimg.cn/direct/0b379bbd79834ff39b3625d617844f8b.png)
软件测试基础1--功能测试
1、什么是软件测试? 软件是控制计算机硬件运行的工具。 软件测试:使用技术手段验证软件是否满足使用需求,为了发现软件功能和需求不相符合的地方,或者寻找实际输出和预期输出之间的差异。 软件测试的目的:减少软件缺陷…...
![](https://i-blog.csdnimg.cn/direct/ff6859130f4f497c96cf18d9ec55335b.png#pic_center)
《计算机网络》(第8版)第9章 无线网络和移动网络 复习笔记
第 9 章 无线网络和移动网络 一、无线局域网 WLAN 1 无线局域网的组成 无线局域网提供移动接入的功能,可分为两大类:有固定基础设施的和无固定基础设 施的。 (1)IEEE 802.11 IEEE 802.11 是无线以太网的标准,是有固定…...
![](https://i-blog.csdnimg.cn/direct/ff401d1e28a6475c99acfce33fbb5c3b.png)
非负数、0和正整数 限制最大值且保留两位小数在elementpuls表单中正则验证
一、结构 <el-form-item label"单价:" prop"price"><el-inputv-model.trim"formData.price"placeholder"请输入"blur"formMethod.fixTwo"><template #append>(元)</template></el-i…...
![](https://i-blog.csdnimg.cn/direct/91908f64d49c422a9e918b710abd623a.gif)
Java多线程-----定时器(Timer)及其实现
目录 一.定时器简介: 二.定时器的构造方法与常见方法: 三.定时器的模拟实现: 思路分析: 代码实现: 在开发中,我们经常需要一些周期性的操作,例如每隔几分钟就进行某一项操作,这…...
![](https://i-blog.csdnimg.cn/direct/842fa89310e246ca85ce4376c8c11784.gif)
【Linux修行路】进度条小程序
目录 ⛳️推荐 一、预备知识 1.1 回车换行 1.2 缓冲区 二、倒计时 2.1 注意事项 三、进度条 3.1 源代码 3.2 代码分析 3.2 实际使用场景 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家…...
![](https://img-blog.csdnimg.cn/direct/7598132600534897a08a33d7f404bb52.png)
网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决. 基…...
![](https://i-blog.csdnimg.cn/direct/fddf6ff2321b4e4e8327d837d95a71f6.png)
【探索Linux】P.44(数据链路层 —— 以太网的帧格式 | MAC地址 | MTU | ARP协议)
阅读导航 引言一、认识以太网二、以太网的帧格式三、MAC地址四、MTU五、ARP协议温馨提示 引言 在深入探讨了网络层的IP协议之后,本文将带领读者进一步深入网络的底层——数据链路层。我们将详细解析以太网的帧格式,这是数据链路层传输数据的基本单元&am…...
![](https://i-blog.csdnimg.cn/direct/0417d64747cc4aa9ad642fcccd1adb7e.png)
<数据集>航拍行人识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:7482张 标注数量(xml文件个数):7482 标注数量(txt文件个数):7482 标注类别数:1 标注类别名称:[people, pedestrian] 序号类别名称图片数框数1people5226385602pedes…...
![](https://www.ngui.cc/images/no-images.jpg)
在 Windows 10 系统上部署 Medusa
先决条件 在安装 Medusa 之前,你需要确保已经安装了以下工具: Node.js: Medusa 需要 Node.js v16 或更高版本。你可以从 Node.js 官网下载并安装。Git: Git 用于从 GitHub 获取 Medusa 的源代码。你可以从 Git 官网下载并安装。PostgreSQL: Medusa 使用…...
![](https://i-blog.csdnimg.cn/direct/5590d492c4ab463fbc01a91544e83519.png)
Linux进程 (冯诺依曼体结构 管理 PCB 进程状态 僵尸进程 孤儿进程 运行阻塞挂起状态 进程优先级)
文章目录 一.冯诺依曼体系结构冯诺依曼结构能干什么? 二.操作系统概念结构图(不完整)为什么要有操作系统? 尝试理解操作系统管理结构图(完整)总结: 三.进程进程是什么?PCB为什么要有PCB? Linux中的PCB进程的task_struc…...
![](https://www.ngui.cc/images/no-images.jpg)
《LlamaIndex 之美》-01-LLM、Prompt、Embedding基础入门
在基于数据构建任何 LLM 应用程序时,选择合适的大型语言模型 (LLM) 是您需要考虑的首要步骤之一。 LLM 是 LlamaIndex 的核心组成部分。它们可以作为独立模块使用,也可以插入到其他核心 LlamaIndex 模块(索引、检索器…...
![](https://www.ngui.cc/images/no-images.jpg)
C++ 智能指针简单介绍及用法
C 智能指针简单介绍及用法 智能指针是 C11 引入的一个非常实用的特性,旨在自动管理动态分配的内存,避免内存泄漏和悬空指针问题。主要有三种类型的智能指针:std::unique_ptr、std::shared_ptr 和 std::weak_ptr。下面是对它们的详细介绍&…...
![](https://www.ngui.cc/images/no-images.jpg)
k8s笔记之创建Istio Gateway规则
创建Istio Gateway 背景如何创建Istio Gateway规则配置方式rewrite重写路径直接去除match,默认都转发到一个服务路由规则多种配置方式实践(即开头的完整版) 涉及的命令补充注意事项 背景 为什么需要使用到Istio Gateway?充当k8s服…...
![](https://i-blog.csdnimg.cn/direct/edba0876c496481da1c05699672abcb1.png)
NAND行业回归盈利:AI与云存储需求驱动
市场概览 根据Yole Group于2024年6月25日发布的市场报告,经过五个季度的亏损之后,NAND闪存行业在2024年第一季度(1Q24)实现了盈利回归。这一转变主要得益于企业级固态硬盘(SSD)领域的强劲需求增长…...
![](https://img-blog.csdnimg.cn/img_convert/cb0a783a0efd65e1190b81d5b8a25114.jpeg)
【限免】频控阵雷达:概念、原理与应用【附MATLAB代码】
微信公众号:EW Frontier QQ交流群:949444104 主要内容 PDA、FDA MATLAB代码 %---------------------------------------- %功能:FDA和相控阵天线方向图 %版本:ver1.0 %时间:2017.11.1 %--------------------------------------- clear all; clc; disp…...
![](https://i-blog.csdnimg.cn/direct/f18d7453221144e2b6ccbb4996f04765.png)
从0开始搭建vue + flask 旅游景点数据分析系统( 六):搭建后端flask框架
这一期开始开发header部分,预期实现两个目标: 创建 Flask 项目导入旅游数据后端实现旅游数据的查询 1 python 环境 & 开发环境 python 安装和pycharm安装需要去网上找包,建议python使用3.8 或者3.9版本 2 新建项目 我们新建一个文件…...
![](https://i-blog.csdnimg.cn/direct/5c83c5b2172d4562a3d58a842ff456c1.png)
学习硬件测试04:触摸按键+PWM 驱动蜂鸣器+数码管(P62~P67、P71、P72)
一、触摸按键 1.1理论讲解 1.1.1实验现象 触摸按键 1 单击与长按,控制 LED1;触摸按键 2 单击与长按,控制 LED2;触摸按键 3 单击与长按,控制 LED3;触摸按键 4 单击与长按,控制继电器; 1.1.2硬件电路 是原理图上触摸…...
![](https://i-blog.csdnimg.cn/direct/f42bfa0d2b734c5bb88543605e5904fc.png#pic_center)
JS原型链
JS的原型链 文章目录 JS的原型链前言一、原型是什么?二、原型链总结 前言 在使用数组或对象中的方法时,你是不是会感觉很奇怪,为什么仅仅是创建了一个数组或是对象,就能够使用它提供的方法呢?JS是怎么做到的呢&#x…...
![](https://i-blog.csdnimg.cn/blog_migrate/2a3f71e4841aa4fd325dec50adc60981.png)
《Java初阶数据结构》----5.<二叉树的概念及使用>
前言 大家好,我目前在学习java。之前也学了一段时间,但是没有发布博客。时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…...
![](https://img-blog.csdnimg.cn/2e3c99f0a4b845b29f5bf275a90a552f.jpeg)
git查看记录详解
文章目录 git查看记录查看文件修改列表查看修改差异友好的查看修改记录结合多个选项查看记录示例输出 git查看记录 使用 git log 你不仅可以查看提交记录,还可以通过一些选项查看文件的修改列表、修改差异,并以更友好的方式查看修改记录。以下是一些常用…...
![](https://i-blog.csdnimg.cn/direct/dbce5f50bab54e718783ab68a6a51de2.png)
检索增强生成RAG系列10--RAG的实际案例
讲了很多理论,最后来一篇实践作为结尾。本次案例根据阿里云的博金大模型挑战赛的题目以及数据集做一次实践。 完整代码地址:https://github.com/forever1986/finrag.git 本次实践代码有参考:https://github.com/Tongyi-EconML/FinQwen/ 目录 …...
![](https://www.ngui.cc/images/no-images.jpg)
程序员自我提升的全面指南
程序员自我提升的全面指南 1. 技术基础巩固重要性实践方法 2. 技术栈拓展重要性实践方法 3. 软技能提升重要性实践方法 4. 实践与项目经验重要性实践方法 5. 持续学习与职业规划重要性实践方法 6. 代码质量与优化重要性实践方法 7. 思维与创新能力重要性实践方法 8. 健康与心理…...
![](https://www.ngui.cc/images/no-images.jpg)
【golang】Golang手写元组 tuple | golang tuple
Golang手写元组 tuple 1、源码 如下: package tupletype Tuple[T any, U any] struct {First TSecond U }// zip combines elements of two slices into a slice of pairs (tuples), which is useful for combining related data. func Zip[T any, U any](slice…...
![](https://www.ngui.cc/images/no-images.jpg)
golang中struct的tag -简记
今天 简单整理一下,关于golang中struct的tag type User struct {UId int gorm:"column:uid;type:bigint;unique_index;not null;comment:用户id"Name string json:"name"Age int bson:"age"From string binding:"requi…...
![](https://i-blog.csdnimg.cn/direct/39df3a28333d42f5a6d322c539429b75.png)
分布式领域扩展点设计稿
分布式领域扩展点设计稿 背景坐标设计理念设计图Quick Start相关组件 背景 随着交易业务和基础知识的沉淀,愈发觉得扩展点可以在大型交易分布式架构中可以做更多的事情。 经过一个月的思考,决定将 单点领域扩展点(savior-ext) 从…...
![](https://img-blog.csdnimg.cn/direct/402a907e12694df5a34f8f266385f3d2.png#pic_center)
玩转微信公众号变现:从新手到专家的全攻略
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...
![](https://img-blog.csdnimg.cn/6df90df4d9a44b3fb1104cdf29a09ea0.png?)
物联网网站的建设和维护/河南seo推广
详情参考 https://blog.csdn.net/SeekN/article/details/114231727 Deque是双端队列,可以从队头队尾入队出队。 Queue是单向队列 只能从对位入队,队头出队 插入删除两种操作方法的区别: 1、add和offer区别 一些队列会有大小限制,…...
![](/images/no-images.jpg)
做新媒体国外网站/网络销售挣钱吗
看到最近流行的微信拍一拍功能,复习下CSS3的animation,所以写下这个盒子晃动的动画,把qq的窗口抖动也加上吧-webkit-keyframes shake {0% {-webkit-transform: translate(2px, 2px);}25% {-webkit-transform: translate(-2px, -2px);}50% {-webkit-trans…...
![](/images/no-images.jpg)
qq刷赞网站如何做分站/网站seo优化步骤
Magic Pairs Problems Link Mean: 已知N、A0、B0,对于给定X、Y,若A0XB0Y能被N整除,则AXBY也能被N整除,求所有的A、B.(0<A、B<N) analyse: 这道题目就是先把A0和B0和N都除以他们的最大公约数,然后就…...
![](/images/no-images.jpg)
海门公司网站制作费用/哪里有竞价推广托管
1.基本介绍:集合就是存放对象的,他比数组好的一点就是他一开始不清楚自己长度容器一般是分为很多种的,很多的容器在一起然后进过断的抽象和抽取就成了一个体系,我们称之为集合框架我们看体系首先是看顶层的容器,他是底…...
![](/images/no-images.jpg)
wordpress还原/软件开发定制
k近邻算法是机器学习中原理最简单的算法之一,其思想为:给定测试样本,计算出距离其最近的k个训练样本,将这k个样本中出现类别最多的标记作为该测试样本的预测标记。 k近邻算法虽然原理简单,但是其泛华错误率却不超过贝…...
![](https://s4.51cto.com/wyfs02/M02/85/AF/wKioL1esNkGg0olzAAAvXrzddQk774.png-wh_500x0-wm_3-wmp_4-s_608770670.png)
哪家网站开发公司好/怎么建网页
grep以前我们用grep在一个文件中找出包含某些字符串的行,比如在头文件中找出符合某个模式(Pattern)的一类字符串,例如找出所有符合xxxxxxxx.xxx模式的字符串(也就是email地址),要求x字符是可以是…...