- 博客(50)
- 问答 (2)
- 收藏
- 关注
原创 560.和为K的子数组(js)
给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的子数组的个数。子数组是数组中元素的连续非空序列
2024-01-27 00:34:10
534
原创 js截屏html2canvas和rasterizehtml使用心得
rasterizehtml性能好很多,截一张图耗时只需50毫秒,是html2canvas耗时的十分之一,若需往截图上添加内容,拼接html就好。然而有一个致命缺陷,无论屏幕怎么滚动,截的图始终没变。html2canvas能截准滚动后当前屏幕展示的样子,可通过ctx往截图上添加内容,可惜性能太差,截一张图耗时接近500毫秒,连续截图会有卡顿感。
2023-05-08 10:38:56
1087
原创 前端项目如何自定义一个脚本命令
此时跑yarn my-script就可看到控制台打印了失败error Command failed with exit code 1.这样,当我们"npm run my-script"或者"yarn my-script"时就相当于在命令行跑"node ./src/myScripts/firstScript.js"。扩展:脚本内容中还可使用childProcess.execSync('yarn xxx')去跑其他命令。
2022-11-15 20:25:10
940
原创 js遍历文件目录
通过fs.readdirSync获取目录内容,fs.statSync获取内容项实例,然后判断是目录还是文件,是目录的话继续递归遍历。当我们需要在项目里找到目标文件或是某一类后缀的文件时,就需要对目录做遍历了。
2022-11-15 19:45:25
3392
原创 简单写一个hoc
hoc类似vue里的mixins,可以将一些公用逻辑写成hoc,但凡使用这个hoc的组件都具有这些逻辑。上面的Hoc只是基本架子,具体根据实际业务去写,一般来说是封装公用钩子处理、传递公用参数或方法。
2022-11-14 16:44:01
266
原创 使用babel检查和添加代码
找到要添加的位置,通过@babel/types调用节点类型同名的方法创建该类型的节点,鼠标放到名字上会有提示传入什么样的参数。babel就是个js编译器,可以用来实现代码检查、代码生成、自定义语法等功能。通过@babel/generator将ast转变成代码,ok,万事大吉。使用@babel/parser将源代码解析成AST树。使用@babel/traverse对AST树进行遍历。ast是用来表示代码结构的一种树结构,可以借助网页。输入代码查看对应的ATS树。找到目标所在位置,然后判断。
2022-10-26 04:30:07
826
原创 使用htmlWebpackPlugin添加代码版本信息
不知道你是不是这样的场景哈,或者曾经是。你提交完代码、部署然后测试去测,测试说你这个bug改了吗,怎么还是一样?然后你就纳闷,改过了啊代码也提交了,然后你自己去点一遍验证提交的代码有没有部署上去。这是一个痛点,可能也都习惯了哈,其实,这里有个很好很简单的方式去解决这个问题。这样子打包部署后,index.html里就有相应信息了,看代码有没有部署上去直接点控制台Elements看这里就能知道了。......
2022-08-02 22:09:26
804
原创 包含min函数的栈(js)
要能得到栈内最小元素,容易想到用一个变量来存这个元素,但问题是这个元素出去以后,下一个最小元素呢?解决该问题就得专门用一个数组来存第一小第二小第三小...的元素们了,定义两个数组,主数组arr1用来做栈的出栈和入栈,副数组arr2用来存小元素。定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push及pop的时间复杂度都是O(1)。由此,arr2中存的元素越往尾部越小,每次读尾部最后一个元素就是最小元素。...
2022-07-26 15:28:30
335
原创 设计模式之策略模式(js)
策略模式主要用来优化对多种情况或多种条件的处理,不用策略模式的话你可能会写很多ifelse,并且如果之后要新加条件,你又要去改动代码主体。而策略模式就很好解决了这两个问题,策略模式对多种条件进行封装,代码简洁,后续添加仅需修改配置内容,极大的提高了稳定性和延展性。现在有个需求根据对象分配任务,用ifelse或者switch大家都能想到样子,我们看下策略模式呢。说到策略模式,其实你并不陌生啊,不相信?这你再熟悉不过了吧!再来点🌰,体会体会它的思想。平常也可以做些小优化,比如。.........
2022-07-15 18:04:43
204
原创 递归优化之缓存结果(js)
为啥要优化?有时候递归里会有大量重复运算,肯定没必要啊,这时候缓存是个好东西。举个代表性例子:斐波拉契数列,由0和1开始,后面每项数值为前两数之和,0 1 1 2 3 5 8 ......不做优化的递归:若计算第100项,左边fn(99) + 右边fn(98),左右两边是不是都要共同计算fn(97)、fn(96)、fn(95)、fn(94)、......,现在,缓存它!!!优化后的递归:当n越大,加上缓存的递归效率就越明显了...
2022-07-14 17:20:57
227
原创 二叉树的前、中、后、层次非递归遍历(js)
有如下二叉树遍历:// 前序遍历, head-left-right function HLR (tree) { const stack = [], res = [] if (tree) stack.push(tree) while (stack.length) { const cur = stack.pop() res.push(cur.val) // 栈先入后出,所以.
2022-04-23 20:53:26
1198
2
原创 算法:三数之和(js)
题目:力扣思路:排序 + 首尾双指针,在当前元素的右边进行首尾指针移动,当前元素+left指向的值+right指向的值 === 0时,res中存入该组值。代码:var threeSum = function(nums) { const res = [] const arr = nums.sort((a, b) => a - b) for (let i = 0; i < arr.length - 2; i ++) { let left = i.
2022-04-23 19:45:56
704
1
原创 算法:跳跃游戏(js)
题目:力扣思路:试想一下,若从第三位置可以跳到第五位置,那只要前面有一个点能跳到第三位置即可说明整体能跳到第五位置。终点为最后一个点开始,看终点的前面是否存在一个点能跳到终点,若有这个点,此时终点为这个点,继续同样逻辑。代码:var canJump = function(nums) { let distance = nums.length - 1 for (let i = nums.length - 2; i >= 0; i --) { if (num
2022-04-13 01:16:00
2802
2
原创 算法:全排列(js)
题目:力扣思路:拿nums = [1,2,3]来看,可分成1,2,3三条路线,1路线又可分成1-2,1-3两条路线,1-2路线走1-2-3到终点,1-3路线走1-3-2到终点,至此1路线全部走完。同理走完2路线和3路线,每到终点记录本次路径。代码:var permute = function(nums) { if (!nums) return [] const res = [] const run = path => { if (path.leng
2022-04-13 00:37:28
461
原创 算法:最大子数组和、乘积最大子数组(js)
题目:最大子数组和力扣思路:本次i最大值curMax为curMax加上当前元素或者当前元素作为curMax的新值, 更新总体最大值res为本次最大值curMax或者仍然是res。代码:var maxSubArray = function(nums) { let curMax = nums[0] let res = nums[0] for (let i = 1; i < nums.length; i ++) { curMax = Math.max(.
2022-04-06 01:56:39
329
原创 合并二叉树(js)
题目:力扣思路:树的合并看成节点的合并,注意节点为null的处理代码:var mergeTrees = function(root1, root2) { if (!root1 && !root2) return null return { val: (root1 ? root1.val : 0) + (root2 ? root2.val : 0), left: mergeTrees(root1 ? root1.left : nul
2022-03-29 00:40:52
583
原创 算法:买卖股票的最佳时机(js)
题目1:只进行一笔交易力扣思路: 变量low表示当天前的最低点、res表示当天的最大利润, 每一天更新一次low和res代码:var maxProfit = function(prices) { let low = prices[0] let res = 0 for (let i = 1; i < prices.length; i ++) { low = Math.min(low, prices[i]) res = Math.ma.
2022-03-28 22:25:22
598
原创 算法:搜索插入位置(js)
题目:力扣思路:要求时间复杂度为 O(log n)就要使用二分查找了。代码:var searchInsert = function(nums, target) { let left = 0, right = nums.length - 1 while (left <= right) { const temp = Math.floor((left + right) / 2) if (nums[temp] === tar
2022-03-28 01:27:23
322
原创 算法:完全平方数(js)
题目:力扣思路:动态规划,求出1到n对应的结果,返回n对应的结果。拿n=13这个例子看,13 = 4 + 9,也就是13 = 4 + 3 * 3, 所以arr[13] = arr[4] + 1 = 1 + 1 = 2。代码:var numSquares = function(n) { const arr = new Array(n + 1).fill(0) for (let i = 1; i <= n; i ++) { arr[i] = i
2022-03-27 23:22:29
529
原创 删除链表的倒数第 N 个结点(js)
题目:力扣思路:三个指针,最终要让p2指针指向尾节点,p1指针指向倒数第n个节点,p0指针指向p1的前一个节点,此时让p0的下一个为p1的下一个就完事了。操作:先让p2指针移动n个节点,此时p2与p1相差n,之后三个指针同时移动直到p2指针到了尾结点位置。代码:var removeNthFromEnd = function(head, n) { let res = new ListNode() res.next = head let p0 = res, p1 = res
2022-03-27 16:16:35
500
原创 算法:移除元素、删除有序数组中的重复项(js)
题目:移除元素力扣思路:把是目标的元素更新为下一个非目标的元素,这样得到j前面的全是非目标元素,j往后的元素全部丢弃。代码:var removeElement = function(nums, val) { let j = 0 for (let i = 0; i < nums.length; i ++) { if (nums[i] !== val) { nums[j] = nums[i] j ++ .
2022-03-24 23:50:31
631
原创 两两交换链表中的节点(js)
题目:力扣思路:迭代,p1、p2分别指向要交换位置的左、右节点,连接,更新指针,具体看下面代码。代码:var swapPairs = function(head) { const res = new ListNode() res.next = head let temp = res while (temp.next && temp.next.next) { const p1 = temp.next, p2 = temp.next.
2022-03-24 23:27:53
763
原创 两数之和,o(n)解法
题目:力扣思路:使用数据结构map降低查找的时间复杂度代码:var twoSum = function(nums, target) { const map = new Map() for (let i = 0; i < nums.length; i ++) { const temp = target - nums[i] if (map.has(temp)) { return [i, map.get(temp)]
2022-03-24 20:39:25
179
原创 重建二叉树(js)
题目:力扣思路:递归,通过重建节点的左子树和右子树,实现对整个二叉树的重建,抓住前序遍历是’根左右‘,中序遍历是’左根右‘的特性,更新需要传给函数的前序遍历和中序遍历。代码:var buildTree = function(preorder, inorder) { if (!preorder.length || !inorder.length) return null const root = preorder[0] const i = inorder.indexOf(
2022-03-24 03:35:14
336
原创 二叉树的深度(js)
题目:力扣思路:深度优先遍历,用一个变量记录当前的最大深度代码:var maxDepth = function (root) { if (!root) return 0 let l = 0 function getMaxL(root, deep) { l = Math.max(l, deep) if (root.left) { getMaxL(root.left, d
2022-03-23 02:02:41
488
原创 listToTree(js)
给出list:const list = [ {id: 0, val: 0, parentId: null}, {id: 1, val: 1, parentId: 0}, {id: 2, val: 2, parentId: 0}, {id: 3, val: 3, parentId: 1}, {id: 4, val: 4, parentId: 2}]将该list转变为树形结构:方法一:递归,依次找到每个节点的childrenfunction list
2022-03-22 20:39:12
1484
原创 算法:盛最多水的容器(js)
题目:https://leetcode-cn.com/problems/container-with-most-water/思路:双指针,一头一尾,谁较小谁先往中间移动,不断更新此时的最大面积代码:var maxArea = function(height) { let i = 0, j = height.length - 1, maxArea = 0 while (i < j) { maxArea = Math.max(maxArea, (j - i)
2022-03-20 13:26:01
106
原创 算法:版本号比较、排序
1、版本号比较题目:力扣思路:将版本号转成数组,两两对应比较代码:var compareVersion = function(version1, version2) { const arr1 = version1.split('.').map(e => e * 1) const arr2 = version2.split('.').map(e => e * 1) const length = Math.max(arr1.length, arr2.leng
2022-03-17 20:35:00
5629
原创 环形链表,判断是否有环
题目:力扣解法1:利用set结构存每个节点,若节点已存在则有环;var hasCycle = function(head) { const s = new Set() while (head) { if (s.has(head)) { return true } s.add(head) head = head.next } return false};解法2:慢指针走一步,
2022-03-15 20:03:27
563
原创 两个链表的交点(js)
题目:力扣思路: 使用数据结构set去存A链表的每个节点,遍历B链表看当前节点是否已经在set中存在代码:var getIntersectionNode = function(headA, headB) { const visited = new Set(); let temp = headA; while (temp) { visited.add(temp); temp = temp.next; } temp = hea
2022-03-13 13:33:41
947
原创 算法:两数相加(js)
题目:力扣思路:直接看代码最清晰var addTwoNumbers = function(l1, l2) { let res = new ListNode() let cur = res let need = 0 while(l1 || l2) { let sum = need if (l1) { sum += l1.val l1 = l1.next }
2022-03-01 23:03:09
238
原创 算法:最长回文子串(js)
给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb"来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-substring思路:两边扩散,若扩散的左右两边相等则仍然是回文子串,每得到一个更大长度的回文子串就赋给res。代码:var longe
2022-02-16 23:06:04
2715
4
原创 算法: 整数转罗马数字(js)
题目链接:力扣思路:把关系表示出来,从大的开始拼凑代码:var intToRoman = function(num) { const map = { 'M': 1000, 'CM': 900, 'D': 500, 'CD': 400, 'C': 100, 'XC': 90, 'L': 50, 'XL': 40, 'X': 10,
2022-02-16 01:59:55
313
原创 算法:罗马数字转整数(js)
题目链接:力扣解题思路:代码:左大右小用加,左小右大用减var romanToInt = function(s) { const map = { 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000 } let ans = 0; const n = s.length;
2022-02-16 01:26:35
224
空空如也
beforeUpdate在具体哪个时候触发
2021-06-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人