随笔分类 - 算法和数据结构
摘要:哈希表是什么 是一种用于存储键值对(key-value pair)的数据结构。在哈希表中,通过哈希函数将键(key)映射到数组的某个位置(索引),然后在该位置存储对应的值(value)。 哈希表适用于处理需要根据键快速查找的场景,如数据库索引、缓存等。 哈希表的关键特性: 键的唯一性:每个键在哈希表
阅读全文
摘要:链表(Linked List)是一种线性数据结构,它由一系列的节点组成,其中每个节点包含两部分: 数据部分:存储节点的实际数据。 指针部分:存储指向下一个节点的引用(或指针)。 与数组不同,链表中的元素不需要在内存中是连续的。每个节点通过指针连接到下一个节点,形成一个链式结构。 链表有多个变种,包括
阅读全文
摘要:栈(Stack) 栈是一种遵循 后进先出(LIFO, Last In First Out)原则的数据结构。也就是说,最后被放入栈中的元素会最先被取出。 push():将一个或多个元素添加到数组的末尾,返回新数组的长度。 pop():移除数组的最后一个元素,并返回该元素。 peek()(自定义方法):
阅读全文
摘要:数组中找到两个数,它们的和等于给定的目标值 判断一个字符串是否是回文字符串 二分查找法 快速排序算法 js抽奖算法 js生成指定范围的随机数 深拷贝函数的实现
阅读全文
摘要:在一个给定的数字数组中找到两个数,它们的和等于给定的目标值。可以通过多种方法来解决这个问题,以下是两种常见且高效的解决方案。 方法 1:使用哈希表 (Set 或 Map) 通过哈希表来存储已经遍历过的数字,利用哈希表的快速查找特性来实现。在遍历数组的同时,检查当前数字与目标值的差值是否已经存在于哈希
阅读全文
摘要:回文字符串是指正着读和反着读都相同的字符串。比如 "racecar" 或 "level"。 方法 1:使用双指针法 通过使用两个指针,一个指向字符串的开始,另一个指向字符串的结束,逐个比较字符。 function isPalindrome(str) { let left = 0; let right
阅读全文
摘要:一、常用排序算法 快速排序 插入排序 归并排序 二、使用场景 排序算法适用场景时间复杂度(平均)时间复杂度(最坏)空间复杂度是否稳定 快速排序(Quick Sort) 大规模数据、随机数据、数组排序 O(n log n) O(n²)(选错 Pivot) O(log n)(原地排序) ❌ 不稳定 插入
阅读全文
摘要:LRU 缓存算法基于一个基本假设:如果一个数据长时间没有被访问,那么它未来也很可能不会再被访问。因此,当缓存达到上限时,应该淘汰掉最久未被访问的数据。 过期时间:缓存项有一个时间戳(timestamp),每次访问时都会重新设置一个新的过期时间 maxAge,如果缓存项超过 maxAge 设定的过期时
阅读全文
摘要:题目:设计一个js抽奖程序,一共分为三等奖,每一个等级的中奖概率及中奖人数都可自定义。 解法核心: 设定概率: 一等奖概率:10% 即 [0 - 0.1) 的范围 二等奖概率:30%. 即 [0.1 - 0.4) 的范围。注:为什么是从0.1开始?因为<0.1的话就是中了一等奖 三等奖概率:40%
阅读全文
摘要:使用JSON.parse(Json.stringify())实现深拷贝有哪些坑? 如果属性值是undefined、或者函数,序列化后属性丢失; 如果属性值是RegExp、Error对象,序列化后值是{}; 如果属性值是NaN、Infinity和-Infinity,则序列化的结果会变成null 因此一
阅读全文
摘要:插入排序跟打扑克牌一样,每次抽一张牌,按照从小到大的顺序插入到手里的正确位置,操作过程如下: 你从桌面上拿起第一张牌(已经排序)。 拿起第二张牌,插入到正确的位置。 拿起第三张牌,找到它应该在手中的位置,插入。 依次遍历每张牌,找到合适的位置插入。 速记口诀如下:左边有序,右边待插,拿起一张,插入应
阅读全文
摘要:1.矩形相交检测算法 两个矩形相交有如下四种情况: 如果两个矩形,假设为o1和o2,若两者相交,那么矩形o1、o2的中心点与矩形的边长是有一定关系的,如下图: if(Math.abs(x0 - x1) <= o1.width/2 + o2.width /2 && Math.abs(y0- y1) <
阅读全文
摘要:这种算法采用了分而治之的思想: 先拆分(Divide):不断将数组拆成左右两半,直到每个子数组只剩一个元素。 再合并(Merge):从最小子数组开始,逐步将其合并成有序数组。 两个数组合并时,只需要比较二个数组的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,
阅读全文
摘要:二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法。算法思想是不断的缩小查找范围,步骤如下: 1️⃣ 确定基准: 选定数组的中间元素(基准值)。 如果数组大小为偶数,通常选择中间的 右侧元素(也可以选择左侧元素,但不影响算法效果)。 2️⃣ 分割数组: 将数组分成两半,基准
阅读全文
摘要:1. 为什么需要使用虚拟滚动技术? 在前端开发中,会碰到一些不能使用分页方式来加载列表数据的业务形态,我们称这种列表叫做长列表。比如ant-design下拉框的数据项,如果直接将所有的数据都生成dom,页面会非常卡顿。 因此,虚拟滚动的核心思想就是只加载可视区域内需要的列表项,当滚动发生时,动态通过
阅读全文
摘要://json格式的时间转换为js时间 function convertJsonTime(jsonTimeStr) { var regPattern=/^\/Date\((\d+)\)\/$/ if(regPattern.test(jsonTimeStr)){ var totalMs=RegExp.$
阅读全文
摘要:因为 Math.random() 制造的随机数范围是[0, 1)想要生成16到22之间的随机数(即最小值m=16,最大值n=22),首先需要计算出最大值与最小值的差range=m-n 随后把[0, 1)这个区间的随机数乘以range,区间就拓展到[0, 6)。在此基础之上再加最小值,范围就移动到[1
阅读全文
摘要:带小数点的 var a = 8462948.2453; console.log(a.toLocaleString()) //8,462,948.245 不带小数点的 num.toString().replace(/(\d)(?=(\d{3})+$)/g,'$1,') 满足两者情况的 function
阅读全文
摘要:快速排序是20世纪最伟大的算法之一,其核心算法思想可以用在学校上体育课,按身高排列的场景来举例: 选择一个同学作为参照基准点(可随便选择); 分成两组:比这个同学矮的,站左边;反之站右边; 对左、右两个分组重复上面的过程,直到各组只剩一个人; 拼接结果:左+基准值+右 实现难点: 不创建新数组的情况
阅读全文