自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 资源 (1)
  • 收藏
  • 关注

原创 【JS面试题】将数据转换树形结构

复盘一道面试中写的不好的场景题题目描述写一个函数flatToTree(),将扁平化数据转成json树形结构实例输入let flatArr = [ {id: 1, title: "A", parent_id: -1}, {id: 2, title: 'B', parent_id: -1}, {id: 3, title: 'C', parent_id: 2}, {id: 4, title: 'D', parent_id: 3},](元素自身id唯一,pid是父节点。父节点为-1.

2022-03-16 14:32:44 1194

原创 优化TypeScript编译体验

当使用vscode编写ts代码时,我遇到了这样的问题。问题1、手动使用tsc命令编译ts代码时,ts编译器提示函数重复。2、每次需要手动tsc编译,比较麻烦。3、ts代码存在问题时,仍然编译为js。解决1、控制台中使用tsc --init创建tsconfig.json文件,添加默认配置。2、使用tsc --watch,监听ts文件变化,自动编译成js文件。3、使用tsc --noEmitOnError阻止在ts存在问题时仍然编译js的问题。现在只有在ts文件没有问题时,才可以编译成j.

2022-03-01 13:04:25 765

原创 浅读redux源码

1、源码结构当前redux master分支已全部使用typescript,为便于理解可使用4.x分支,仍是js版本)2、createStore2.1 注释部分:创建一个redux store掌管状态树改变store中数据的唯一方式就是调用dispatch()一个app中应该仅具有一个store,多个模块可以使用combineReducers合并不同的reducer2.2 params & returns:@param {Function} reducer传入当前状态树

2022-02-22 22:31:28 500

原创 如何优雅的分享代码

Ubuntu PastebinPastebin轻量便捷的代码分享平台,以web页形式分享你的代码,链接随处可以访问。支持多种语言和代码高亮。可以选择分享有效期。适用于:朋友同事间的代码分享。CarbonCarbon美化代码,以简洁的图片形式分享代码。支持多种语言和代码高亮支持更换字体、大小支持更换背景、主题输出图片适用于:博客内嵌代码、记录代码分享。...

2022-01-17 11:49:46 1021

原创 浏览器控制台无限debugger与解决办法

什么是无限debugger某一天,我在用控制台检查network信息时遇到了很怪的一幕,一旦打开控制台就会自动跳转到debug调试页面firefox浏览器甚至会迅速奔溃chrome中可以看到这样的代码解决办法好家伙,这种情况我还真是第一次见,怕不是写了个脚本无限debug。既然如此,那我就跳过debug,直接禁止端点debugger或者也可以直接禁用网站JavaScript,但这波AOE可能会导致网站内容不可用(慎用)扩展那么这段代码是怎么做到的呢,经过一番搜寻,发现了实现代码如

2021-11-29 13:47:43 7612 1

原创 面试官:怎么手撸一个promise?

前段时间面试时面试官问了我如何手写一个promise,心想只手写过promise的api,那如果直接手写promise应该从哪做起呢?Promise结构&特性结构:1、Promise对象创建一个异步函数2、异步函数中有resolve、reject两个函数参数3、Promise中的fulfilled、pending、rejected三种状态4、Promise的.then执行回调返回新的Promise5、Promise的链式编程特性:1、主动抛出错误,会调用 reject() 方法.

2021-11-09 21:52:55 584

原创 MC基岩服务器升级维护指南

作为腐竹,当官方发了新版本,服务器玩家们一定想要尝鲜玩新版本同时win商店的自动更新会把客户端自动升级,如果服务端不及时升级,服务器将会无法连接。这里记录一下自己给服务器升级的简单方法切记:仅适用于小版本升级,大版本升级必会出问题(避免不了的换周目)1.17.01 -> 1.17.02 √1.17-> 1.181、首先去官网拉取最新版本服务端文件官网服务端下载地址2、将正在运行的服务器暂停,备份把挂在云服务器上的服务先停掉然后将文件全部备份这里推荐使用cp方法(复制文.

2021-10-04 14:27:00 5068

原创 安装robot.js踩坑记录【含出坑指南】

最近在写一个node的小项目,要用到模拟鼠标键盘的操作,于是找到了robot.js。安装库的时候遇到了一些问题,由于官方文档里并没有详细指引,故自行解决后记录下来,希望能帮助到别人。1、 robot.js官方安装It s that easy (十分嘲讽)因为马上就开始报错了。2、vs环境报错npm正常下载之后,与其他库不同的是robotjs需要进行build操作(自动进行)会进行一系列的检测(需要vs环境和python环境)如果有版本不对或者文件缺失就会报错下图是我在安装时的详细报错.

2021-09-20 16:09:23 10178

原创 VScode powershell升级管理员权限

1、给vs快捷方式启动选项加上管理员启动右键属性->兼容性->勾选管理员启动2、管理员身份打开powershell执行:get-ExecutionPolicy,返回Restricted执行:set-ExecutionPolicy RemoteSigned输入Y3、重启vscode...

2021-09-20 13:39:48 3405

原创 什么是前缀和?leetcode例题解答

前缀和假设给定数组[1,1,1,1]以及两个下标j k j<k,现在要你求j到k的所有数字的和,怎么做呢?我们当然可以根据这两个下标把对应的数字依次累加从而得到结果,这没问题,但如果我们要求很多个范围的和,这个数组也很大,每次都得从头开始累加就特别耗时了,有没有什么办法能从O(1)的时间复杂度直接得到结果,这就需要利用到前缀和。假设我们有一个前缀和数组preSum,它和原数组的对应关系如下,也就是说我们通过一次遍历,已经知道了从下标0到每个下标 i 的元素和那么现在,我们要知道下标1到下标3的

2021-09-14 16:13:14 261

原创 Js继承汇总

1、原型链继承基本思想:通过原型链继承多个引用类型的属性和方法原型链扩展了原型搜素机制:在读取实例上的属性时,首先在实例上搜索这个属性,没找到则会继续搜索实例的原型,实现原型链继承之后,搜索继续向上搜索原型的原型。//原型链继承function Father() { this.value = "F";}Father.prototype.getFatherValue = function () { return this.value;};function Son() { this

2021-08-27 11:13:59 116

原创 你不知道的Effect hook

第一遍学hook的时候,只是匆匆带过了几种hook的使用,也用useState、useEffect写了一个小demo但是在看项目代码的时候,发现了effecthook之前没学到的东西,遂回头再学一次,加深理解并记录下来。1、定义Effect Hook 可以让你在函数组件中执行副作用操作,数据获取,设置订阅以及手动更改 React 组件中的 DOM 都属于副作用。不管你知不知道这些操作,或是“副作用”这个名字,应该都在组件中使用过它们。2、使用2.1 初次理解effect hook 一定程度上.

2021-08-27 10:56:35 277

原创 在CRA中自定义webpack

在create-react-app中想要自定义修改webpack有两种方式:eject和不使用eject的其他方式。使用ejecteject 命令执行后会将封装在 create-react-app 中的配置全部反编译到当前项目,这样用户就能完全取得 webpack 文件的控制权。npm run eject 会复制所有依赖文件和相应的依赖(webpack、babel等)到你的项目。是单向操作,eject后就回不去了。使用方法:在新建的cra应用中直接npm run eject。tips:我在第一.

2021-08-26 15:35:24 487

原创 重排重绘与GPU加速

重排重绘我们知道在浏览器渲染过程中存在重排和重绘过程重排当出现以下行为时,会引起重排。添加或删除DOM元素元素的位置发生变化元素的尺寸发生变化浏览器的窗口尺寸变化重绘对 DOM 操作简单修改样式(比如修改元素的 visibility、color、background-color 等)时会引起重绘重排一定会引起重绘!相比较来看,重拍的花销是比重绘要大得多的。所以我们在优化性能的时候会尽量减少dom操作来减少重排。(跟踪重绘:打开Chrome的DevTools中re

2021-08-26 15:04:23 514

原创 Js中map与Object对比思考

在实际应用中,有用到map来存数据,自然联想到了普通对象Object和数组我知道数组有序,对象无序,那map这种特殊的结构是有序吗?思考后查阅了资料,整理总结如下文章目录mapObjectmap&Object对比Objectsmap&Object应用场景map一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个 for…of 循环在每次迭代后会返回一个形式为[key,value]的数组。Object一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一.

2021-08-16 11:16:04 693

原创 JS二叉树的三种遍历【递归】

前序遍历:var preorderTraversal = function(root, res = []) { if (!root) return res; res.push(root.val); preorderTraversal(root.left, res) preorderTraversal(root.right, res) return res;};中序遍历var inorderTraversal = function(root, res =

2021-08-11 10:41:38 187

原创 JS二叉树的三种遍历【迭代】

前序遍历lc.144迭代法var preorderTraversal = function(root) { // 初始化数据 const res =[]; const stack = []; while (root || stack.length){ while(root){ res.push(root.val); stack.push(root); root = root.left; }

2021-08-10 10:58:00 293

原创 leetcode322.找零钱

经典动态规划,迭代法会超时,直接分析动态规划的几个重点1、状态:dp数组要存什么对于本题,每个问题可以分解成相同的子问题,具体一点举例,求amout的最小硬币数,转化为求amount-1的最小硬币数等等。。dp数组存的就是amount2、状态转移方程具体来看,假设我们有【1,2,5】三种硬币,需要求amount=100的最小硬币数,按照分解的思路,我们要求 max(amount-1最小硬币数+1,amount-2最小硬币数+1,amount-5最小硬币数+1)所以状态转化方程便是dp[i].

2021-08-06 10:58:19 390

原创 Leetcode283【Js】

1、使用mapvar moveZeroes = function(nums) { let index = 0 nums.map(i=>{ if(i!=0){ nums[index] = i index++ } }) nums.fill(0,index)};2、双指针右指针遇到0则右移,非0则与左指针交换。思路:把非0数前移,最后补0var moveZeroes = fun.

2021-07-27 10:55:00 87

原创 剑指Offer 43 / leetcode.23【Js】

1、暴力法直接一个for循环,再用正则匹配得到每一项中1的个数,最后相加。简单粗暴,可是很遗憾,超时了。。。/** * @param {number} n * @return {number} */var countDigitOne = function(n) { let res = 0; for(let i=0;i<=n;i++){ if(i.toString().indexOf('1')!==-1){ let temp = .

2021-07-26 10:42:51 133

原创 leetcode.204 计数质数【Js】

1、(傻瓜向)遍历判断质数从0到根号n,先来判断n是否是质数,再计数。/** * @param {number} n * @return {number} */var countPrimes = function(n) { let isPrime = (n)=>{ for(let i=2;i<=Math.sqrt(n);i++){ if(n%i===0) return false; } return .

2021-07-23 11:12:05 125

原创 leetcode.300【Js】

dp[i]的定义:dp[i]表示i之前包括i的最长上升子序列。状态转移方程位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。if (nums[i] > nums[j]){dp[i] = max(dp[i], dp[j] + 1);}注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1的最大值。dp[i]的初始化每一个i,对应的dp[i](即最长上升子序列)起始大小至少都是是1.确定遍历顺序dp[i] 是有0到.

2021-07-20 10:50:57 155

原创 LeetCode.125验证回文串【Js】

大体思路是先拿到纯净数据(只考虑字母数字),然后再判断是否是回文串,注意要统一大小写。想到两种方式拿到纯净的数据第一种是用asc码+arr.filter()进行筛选第二种考虑用正则拿到数据之后使用数组api:reverse()和join()直接对比字符串返回结果。代码如下var isPalindrome = function(s) { if(!s) return true; let arr = []; for(let i=0;i<s.length;i++){.

2021-07-16 10:50:42 120

原创 leetcode55、45.跳跃游戏 I&II

如果某一个作为起跳点的格子可以跳跃的距离是3,那么表示后面的3个格子都可以作为。 可以对每一个能作为起跳点的格子都尝试跳一次,把能跳到最远的距离不断更新。 如果可以一直跳到最后,就成功了。否则在过程中返回false退出/** * @param {number[]} nums * @return {boolean} */var canJump = function(nums) { let range = 0; for(let i=0;i<nums.length;i+...

2021-07-15 11:08:46 166

原创 剑指offer 62【Js】

很有意思的一道题,暴力超时之后看到了一种巧妙地数学解法。约瑟夫环【逆推迭代】逆推公式:当前index = 上轮(index+m)% 剩余个数i/** * @param {number} n * @param {number} m * @return {number} */var lastRemaining = function(n, m) { let index = 0; for(let i=2;i<=n;i++){ index = (index+m.

2021-07-13 10:47:51 70

原创 剑指offer 50【Js】

方法一:使用indexOf Api,判断最初出现和最后出现位置是否一致,一致则直接输出。否则输出空。var firstUniqChar = function(s) { for(let x of s){ if(s.indexOf(x) === s.lastIndexOf(x)) return x } return ' '};方法二:使用map把值和出现次数映射,然后再找出第一个出现次数为1的值/** * @param {string} s * @r.

2021-07-12 11:10:14 87

原创 Js常见排序算法整理

1、冒泡排序冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。const bubbleSort = (num) => { for (let i = 0; i < num.length - 1; i++) { console.log("FIRST"); let flag = 0; for (let p = 0; p

2021-07-07 14:29:20 253

原创 剑指Offer 39

原地数组时间复杂度空间复杂度较高/** * @param {number[]} nums * @return {number} */var majorityElement = function(nums) { let len = nums.length; let arr = Array(50000).fill(0); for(let i=0;i<len;i++){ if(!arr[nums[i]]){ arr[nums[i].

2021-07-06 10:40:07 98

原创 剑指offer 29/leetcode 54 螺旋矩阵【js】

按照→↓←↑ 的顺序进行遍历,每次走完一边都要判断是否已经符合要求即res数组长度等于row*colomn代码如下:/** * @param {number[][]} matrix * @return {number[]} */var spiralOrder = function(matrix) { if(!matrix.length) return []; let row = matrix.length; let comlumn = matrix[0].length.

2021-07-01 10:27:12 80

原创 剑指offer 33 二叉搜索树后序 js

后序遍历:前 后 根二叉搜索树 :左 < 根 < 右思路:找到根节点之后判断左右子树是否满足二叉搜索树再递归判断左右子树。Js代码如下:/** * @param {number[]} postorder * @return {boolean} */var verifyPostorder = function (postorder) { let len = postorder.length; // 若为叶子节点,则返回 true if (len &lt..

2021-06-30 11:41:22 74

原创 leetcode 39.组合总和 Js

第一想法暴力,然后简单画了两笔发现应该是dfs回溯。然后按“公式”先找dfs结束条件:1、当前总和等于目标 将结果压入结果集 返回2、当前总和大于目标 直接返回注:加入结果集时要复制数组。可以使用 res.push(...[temp])dfs时注意:三个参数(index 开始时的序列,当前数组,当前数组总和)1、第二次dfs传入index为i :保证每次都从当前index向右找(避免了重复情况)2、数组回溯要push&pop代码:/** * @param {number..

2021-06-29 10:35:02 174

原创 leetcode11盛水最多的容器 JS

看到题目的第一感觉是动态规划,于是乎开始苦思冥想了一波。无果然后尝试用笨法做(升级版暴力)从两侧向内包围。每次选择较小的一边向内收紧。保留一个最大的面积res,最终通过。代码如下/** * @param {number[]} height * @return {number} */ //动态规划||双指针 ✅var maxArea = function(height) { let cur1 = 0; let cur2 = height.length-1; let.

2021-06-28 10:50:47 173

原创 leetcode 34&35

1、快速解法:使用数组AP,思路清晰,核心是倒置数组来寻找结束的位置。、时间复杂度不好说(API)空间复杂度O1/** * @param {number[]} nums * @param {number} target * @return {number[]} */var searchRange = function(nums, target) { if(!nums.includes(target)) return [-1,-1]; let first = nums.ind.

2021-06-25 10:44:01 76

原创 leetcode 22:括号生成

暴力法:先将n个( 和n个)全排列,生成a 2n个不同组合,再进行判断是否构成有效括号。lc有类似的判断括号是否有效的题。(lc 20)时间复杂度On空间复杂度On回溯法:dfs函数携带三个参数(左括号剩余,右括号剩余,和当前字符串)当字符串长度满足需求时压入结果数组为了让括号生成出来即有效(不必再次判断结果字符串是否有效)则需要满足两个条件1、有左括号剩余优先左括号。2、右括号只有在数量大于左括号时才使用右括号。tip:字符串回溯,不需要像数组一样复制和增删操作。时间复杂度On.

2021-06-24 10:24:56 174

原创 leetcode12 整数转罗马数字

由于存在放在左边的情况,排列方式并非一种,所以方便起见,可以把特殊情况的组合单独拎出来,打表(字典法)来做。1、首先尝试了对象字典var intToRoman = function (num) { let res = ""; let table = { 1000: "M", 900: "CM", 500: "D", 400: "CD", 100: "C", 90: "XC", 50: "L", 40: "XL", 10: "X", 9: "IX", 5:.

2021-06-23 10:45:53 83

原创 Scss快速上手:减少80%重复的样式代码!

Sass是成熟、稳定、强大的CSS预处理器,而SCSS是Sass3版本当中引入的新语法特性,完全兼容CSS3的同时继承了Sass强大的动态功能在学习成熟的项目时,看到了十分规整的scss代码(以及一堆看不懂的语法),加上之前对sass/scss的好奇,不妨借此机会系统整理总结学习一下。(部分内容参考sass官方文档)1、变量$在代码中最常见到首部的变量声明$color-button:#3ecacb;.button{ color:$color-button;}tip:变量支持块级作用域.

2021-06-21 15:56:49 728

原创 【React】eject暴露配置时Error:Remove untracked files, stash or commit any changes, and try again

尝试用npm run eject暴露webpack配置时报错:Remove untracked files, stash or commit any changes, and try again推断是git的问题,果不其然在stackoverflow上查到是这样的。问题产生原因:      脚手架创建项目产生gitignore,本地无文件仓库解决方案如下      git add .      git.

2021-06-17 11:00:05 233

原创 Js双指针解决有序数组、链表合并

双指针在很多题型中都有应用,快慢指针,左右指针。简单的双指针可以用来解决有序数组链表的排序问题。常见题一:Leetcode21 合并两有序链表思路:两个链表分别放置一个指针,新建一个含有哑节点的链表,while遍历两条链表,链表A到头了 :新链表下一位连到B的当前位置,B指针向后走一位链表B到头了 :新链表下一位连到A的当前位置,A指针向后走一位都没到头就作比较:新链表下一位指向较小的(题目要求升序),并且向后走一位且每轮遍历新链表指针向后走一位。/** * Definitio.

2021-05-11 17:58:37 214

原创 leetcode.200 岛屿数量(DFS)

我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的,而岛屿问题是在一种「网格」结构中进行的。有所不同但也可以类比进行分析。以lc200为例,写一下分析过程。常见的DFS应用二叉树结构,有两个重点边界条件(退出条件)经常用if(!root)扩散方式一般是 dfs(root.left) dfs(root.right)如果是grid网格结构,则边界条件四个边不出界扩散方式每次向四个方向上扩散以lc200为例边界条件: if(i<0||.

2021-05-05 12:51:41 158

原创 面试官:1到n去掉一个数,打乱顺序,你怎么找出缺失的数?

春招面某厂的时候,面试官冷不丁问了这么个问题:1到n去掉一个数,打乱顺序,你怎么找出缺失的数?1、先排序,之后一切都好说。最容易想到的肯定是排序,排完遍历一遍就能找到丢失的数。快排,复杂度O(nlogn),就问面试官你满意不?(面试官皱了皱眉,还有其他的办法吗?)2、用hash总可以了吧。遍历数组放入hashMap中,之后从1到n遍历哈希表,返回值为空的key就是缺失的数。时间复杂度O(n) 空间复杂度O(n)。这下比快排还快,面试官应该满意了吧。(面试官炸了眨眼,除了这俩办法呢?).

2021-04-25 20:33:56 1235

ctf图片隐写神器Stegsolve

包含Stegsolve.jar//需要安装java环境 在分析里面从上到下的依次意思是 File Format:文件格式 Data Extract:数据提取 Steregram Solve:立体试图 可以左右控制偏移 Frame Browser:帧浏览器 Image Combiner:拼图,图片拼接

2020-12-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除