- 博客(56)
- 收藏
- 关注
原创 算法讲解——动态规划
动态规划(Dynamic Programming, DP)是一种解决复杂问题的算法思想,它将大问题分解为小问题,通过存储和重用子问题的解来避免重复计算,从而提高效率。
2025-03-27 16:23:37
451
原创 算法讲解——滑动窗口
滑动窗口是一种用于处理数组/字符串子区间问题的高效算法技巧,通过维护一个动态的窗口(通常是连续的区间),在遍历数据时调整窗口的左右边界,避免重复计算,从而将时间复杂度优化至 O(n)。
2025-03-25 15:51:24
770
原创 算法讲解——双指针算法(js示例代码)
同向双指针:两个指针从同一侧开始移动,通常用于滑动窗口或链表操作。对向双指针:两个指针从两侧向中间移动,通常用于有序数组的搜索或判断问题。快慢双指针:两个指针以不同速度移动,通常用于链表中的环检测或中点查找。
2025-03-21 16:13:52
410
原创 前端常见面试题(不断更新版)
降低请求量:合并资源、压缩文件、使用 WebP、懒加载。加快请求速度:预解析 DNS、减少域名、使用 CDN。缓存:HTTP 缓存、离线缓存、localStorage。渲染:优化 JS/CSS、服务端渲染、利用 HTTP/2。
2025-03-21 11:25:59
1141
原创 JavaScript 中 Set 和 Map 的详细讲解
Set具有唯一性、无序性、可迭代。Set 可以存储任意类型的值(包括基本类型和引用类型)。Map是键值对存储,Map 的键可以是任意类型(包括对象、函数等),Map 会记住键值对的插入顺序,Map 在频繁增删键值对的场景下性能更好。
2025-03-20 16:28:00
698
原创 算法讲解——贪心算法
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优(局部最优)的选择,从而希望导致全局最优解的算法策略。贪心算法的核心思想是“贪心选择”,即通过局部最优解逐步构建全局最优解。
2025-03-18 15:22:30
651
原创 js.49字母异位词分组
map为 Map(3) { 'aet' => 0, 'ant' => 1, 'abt' => 2 }记录该字符串和flag索引,将字符串单独添加进二维数组的末尾,flag++;从map中取出对应的索引,将该字符串添加该索引的二维数组。我们需要把"ate","eat","tea"都看成一类,那么我们可以。使用map集合,存放每组排序后的字符串和对应的数组索引。是由重新排列源单词的所有字母得到的一个新单词。,他们排序后都是“aet”可以放在一类。用flag记录数组索引,从0开始。给你一个字符串数组,请你将。
2025-03-17 17:52:48
116
原创 vue中常见面试题(会不断更新版)
vue中 key 值的作用,$route和$router的区别,路由的两种模式,v-if和v-show的区别,vue.extend和vue.component
2025-03-14 17:55:12
933
原创 SCSS预处理器(详细讲解、入门教程)
Sass通过引入变量、嵌套规则、混入(Mixins)、继承等特性,允许开发者编写更简洁、更有组织的CSS代码。这些特性有助于减少代码重复,提高开发效率,并使得样式表更加易于维护。Sass最终会编译成合法的CSS代码,供浏览器使用。
2025-03-07 23:57:34
622
原创 前端实现权限管理的详细方案(动态路由、接口鉴权、UI 控制 )
核心流程:用户登录 → 获取权限 → 动态生成路由 → 控制 UI 元素。安全原则:前端控制用户体验,后端兜底校验。优化方向:减少请求次数、按需加载权限、Token 短期有效。通过 RBAC 模型,可以实现灵活的权限管理,适用于复杂的企业级应用。实际开发中需结合具体业务场景调整方案。项目中,尤其是管理后台必不可少的一个环节就是权限设计。通常一个系统下的不同用户会对应不同的角色,不同角色会对应不同的组织。
2025-03-07 19:05:34
1238
原创 JavaScript 中数组的所有常用方法(作用、使用方法、细节)
作用:在数组末尾添加一个或多个元素。是否修改原数组:是。1.2 作用:删除数组的最后一个元素。是否修改原数组:是。1.3 作用:在数组开头添加一个或多个元素。是否修改原数组:是。1.4 作用:删除数组的第一个元素。是否修改原数组:是。2. 数组操作2.1 作用:合并两个或多个数组。是否修改原数组:否。作用:从数组中提取一部分。是否修改原数组:否。作用:添加或删除数组中的元素。是否修改原数组:是。作用:将数组中的一部分复
2025-03-06 14:27:53
776
原创 生命周期总结(uni-app、vue2、vue3生命周期讲解)
的生命周期基本一致,但 Vue3 引入了 Composition API,部分钩子函数名称变化,并新增了一些钩子。
2025-03-05 17:21:16
1039
原创 js.316去除重复字母
2,该元素小于栈顶元素,如果此时栈顶元素是最大下标说明后面没有这个字母了,不进行操作,直接让该元素入栈,退出循环。如果此时栈顶元素不是最大下标,说明后面还会有这个字母,将栈顶元素出栈,继续循环判断新的栈顶元素是不是最大下标。解释为什么栈中已经有该元素直接跳过:如果栈中有该元素,那么栈顶元素一定大于或者等于该元素,使用单调栈的思路,明白一个道理,尽最大可能把最小的放在前面,所以优先最小的元素。,请你去除字符串中重复的字母,使得每个字母只出现一次。1,该元素大于栈顶元素,直接入栈。如果是空栈,直接入栈。
2025-03-03 20:10:00
294
原创 js.324摆动排序 II
1,4,1,5,1,6] 同样是符合题目要求的结果,可以被判题程序接受。你可以假设所有输入数组都可以得到满足题目要求的结果。先将nums进行降序排序,n为要循环的次数。
2025-02-28 18:31:07
223
原创 js.字符串解码
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。使用递归和栈的思路,就可以将题目解出来。有一个情况需要考虑,就是数字可能不止一位数的情况。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数。给定一个经过编码的字符串,返回它解码后的字符串。,表示其中方括号内部的。
2025-02-18 15:51:53
299
原创 js.字典序排数
使用dfs深度优先搜索,从1开始进行搜索,每次搜索的当前值是cur*10+i。同时,如果当前搜到的数字的长度和n的长度一样,也不用继续搜索了。条件是如果搜到的当前值大于n,就截止。你必须设计一个时间复杂度为。
2025-02-17 16:02:29
148
原创 js.根据身高重建队列
编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。接下来,就按照array2D数组的顺序,依次排序。
2025-02-14 14:43:35
423
原创 js.买卖股票的最佳时机 II
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0。
2025-02-12 17:22:46
132
原创 Echarts入门教程(基础详细)
ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。官网地址:Apache ECharts你可以使用如下命令通过 npm 安装 ECharts2,引入ECharts3,创建DOM容器在Vue组件的模板部分,创建一个用于放置ECharts图表的DOM容器。例如:4,初始化ECh
2025-02-12 15:12:03
2442
原创 强大的代码编辑器【vue3-ace-editor的使用】
如果你还没有安装 Ace Editor 或其 Vue 封装组件,你需要先安装它们。例如,如果你使用的是。现在,你就得到了支持sql语言高亮和代码补全功能的代码编辑器啦~~~
2024-12-23 14:13:00
993
原创 js.重排链表
然后将第一个元素的next指向最后一个元素,最后一个元素的next指向headRight,最后一个元素的前一个元素的next赋值为NULL。每次处理就是遍历链表得到最后一个元素和最后一个元素的前一个元素,不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。处理完后,将headRight继续递归,直到链表长度小于3。只要链表的长度大于等于3,就可以进行处理。headRight是链表的第二个元素。我使用的是递归的方法。
2024-12-04 16:31:14
376
原创 js.二叉搜索树中第K小的元素
没看清题目是搜索二叉树,误以为是二叉树,所以用的是层次遍历,时间较慢。,请你设计一个算法查找其中第。小的元素(从 1 开始计数)。给定一个二叉搜索树的根节点。
2024-11-27 16:14:45
444
原创 用el-scrollbar实现滚动条,拖动滚动条可以滚动,但是通过鼠标滑轮却无效
得知:由于我监听了祖先元素的滚动事件做了一些处理,所有该元素的滚动事件冒泡到了祖先元素,而祖先元素页面高度不够不能滚动,所以页面看起来没有改变。在开发者工具中, 元素->时间监听器中发现当我移除网页中祖先元素的滚动事件,该组件的滚动事件就可以生效了。用elementplus实现的滚动条的页面中,滑动滚动条可以滚动,但是通过鼠标滑轮却无效,鼠标没有问题。给这个组件添加滚动事件,阻止事件冒泡到主页,就可以解决问题了。
2024-11-22 23:37:10
1485
原创 js.矩阵中的蛇
题目测评数据保证蛇在整个移动过程中将始终位于。蛇从单元格 0 开始,并遵循一系列命令移动。的大小,另给你一个字符串数组。后蛇所停留的最终单元格的位置。
2024-11-21 15:27:52
460
原创 js.二叉树的最近公共祖先
中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(如果本身加上左和右的sum值 == 2 ,则让newnode等于root,记录当前节点。通过递归的方式来实现栈结构,用 sum 来记录本身加上左和右的含 p 和 q 的数量。结束条件是 if(newnode!如果newnode不为空,说明找到了最近公共祖先节点,直接结束查找。因为根据定义最近公共祖先节点可以为节点本身。的最近公共祖先是节点。的最近公共祖先是节点。
2024-11-18 09:09:22
783
原创 js.相交链表
请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。,函数返回结果后,链表必须。
2024-11-15 15:45:59
1757
原创 js.删除并获得点数
前 i 个的最大点数为 如果前 i - 2 的最大点数加上第 i 个的点数大于前 i - 1 的最大点数,那么前 i 个的最大点数为前 i - 2 的最大点数加上第 i 个的点数,否则为前 i - 1 的最大点数。先创建长度为数组中最大值+1的数组arr,将nums数组中的对应值x,加到arr[x]中去,得到的数组arr的每个值item为数组 nums 中所有相同元素item之和。之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。删除 4 获得 4 个点数,因此 3 也被删除。
2024-11-12 18:57:23
917
原创 js.青蛙过河
青蛙可以成功过河,按照如下方案跳跃:跳 1 个单位到第 2 块石子, 然后跳 2 个单位到第 3 块石子, 接着 跳 2 个单位到第 4 块石子, 然后跳 3 个单位到第 6 块石子, 跳 4 个单位到第 7 块石子, 最后,跳 5 个单位到第 8 个石子(即最后一块石子)。最远可跳到的第几个石头值如果为stones的长度-1,表示可以跳到最后一个石头上,则结束函数返回true。代码中的 f 是sum数组的索引,f 每次++ ,代表跳到了第几块石头。另请注意,青蛙只能向前方(终点的方向)跳跃。
2024-11-07 17:42:13
686
原创 js.打家劫舍
每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。从第三个值开始,arr数组的每一个值为arr[i-2] + nums[i]和arr[i-1]的最大值。先求出前两个的值,第一个值为nums[0],第二个值为nums[0]和nums[1]的最大值。偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。,一夜之内能够偷窃到的最高金额。
2024-11-05 14:43:12
363
原创 js.轮转数组和旋转链表
1 数组长度比k大,先取出数组的后k个值复制到新的数组。让第nums.length-1-i的值,等于它的第前k的值。再将新数组的值赋值到nums的前k个值。2 长度比k小,反复让k减去数组长度,直到数组长度大于k。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],将数组中的元素向右轮转。首先分为两种情况来写,
2024-11-04 22:33:53
617
原创 js.相同的树
如果结点值相同且不为null,将数组第一个元素的左右结点放入数组队列,删除数组第一个元素;如果结点值相同且为null,将数组第一个元素删除后,函数continue。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。层次遍历,如果两棵树结点的值不一样,返回false;,编写一个函数来检验这两棵树是否相同。// 比较值,分情况判断。// 取出两个树的值。给你两棵二叉树的根节点。
2024-10-29 15:55:35
1040
原创 js.最长回文串
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。可以构造的最长回文串是"a",它的长度是 1。给定一个包含大写字母和小写字母的字符串。不能当做一个回文字符串。通过这些字母构造成的。在构造过程中,请注意。
2024-10-26 00:04:51
405
原创 js.最长重复子数组
如果 A[i] == B[j],那么我们知道 A[i:] 与 B[j:] 的最长公共前缀为 A[i + 1:] 与 B[j + 1:] 的最长公共前缀的长度加一,否则我们知道 A[i:] 与 B[j:] 的最长公共前缀为零。考虑到这里 dp[i][j] 的值从 dp[i + 1][j + 1] 转移得到,所以我们需要倒过来,首先计算 dp[len(A) - 1][len(B) - 1],最后计算 dp[0][0]。N 表示数组 A 的长度,M 表示数组 B 的长度。空间复杂度: O(N×M)。
2024-10-24 23:08:16
1018
原创 js.岛屿数量
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。(水)组成的的二维网格,请你计算网格中岛屿的数量。此外,你可以假设该网格的四条边均被水包围。
2024-10-23 13:21:54
478
原创 js.两数相加(链表)和反转链表
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。的方式存储的,并且每个节点只能存储。
2024-10-22 16:34:13
894
原创 js.寻找峰值,x的平方根(二分查找)
找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回。或者返回索引 5, 其峰值元素为 6。3 是峰值元素,你的函数应该返回其索引 2。你的函数可以返回索引 1,其峰值元素为 2;峰值元素是指其值严格大于左右相邻值的元素。// 左右两边同时判断。// n为数组的长度。// 考虑边界的问题。你必须实现时间复杂度为。的算法来解决此问题。
2024-10-21 10:31:17
329
原创 js.水壶问题
这里面有一个注意点,就是如果set集合中放的是[0,0]这种的数组,那么set.has比较的是数组的原地址,而不是数组中的值。初始的a和b为0,[0,0]先入栈,然后每次取出栈中的第一个元素并让它出栈,分析它的这六种情况,将可行的情况入栈。6. 从 5 升的水壶向 3 升的水壶倒水直到 3 升的水壶倒满。2. 把 5 升的水壶倒进 3 升的水壶,留下 2 升(3, 2)。4. 把 2 升水从 5 升的水壶转移到 3 升的水壶(2, 0)。考虑原水壶的水空了和倒入水的水壶满了的情况。
2024-10-20 20:13:30
1752
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人