自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 https 加密原理

涉及到的一些概念:对称加密、非对称加密、数字签名、数字证书。为什么要加密?因为http传输内容是明文的,明文数据在传输过程中,会经历,中间代理服务器、路由器、wifi热点、通信服务运营商等多个物理节点,如果信息传输过程被劫持,传输内容会完全暴露;劫持者还可以篡改传输信息,而不被对方察觉,这就是中间人攻击;所以,需要对传输的信息进行加密。什么是对称加密?简单说,类似于日常生活中的钥匙,两个人有同一把钥匙,可以开同一把锁。对称加密中的密钥,可以加密一段信息,也可以对加密后的信息进行解密。什么

2022-05-18 16:10:50 455

原创 记录 markdown 文档的基本常用语法

markdown 基本语法

2022-05-14 15:18:37 209

原创 这一篇,彻底搞懂浏览器的缓存机制

先给出结果,浏览器缓存分两种:强制缓存、协商缓存。为什么需要缓存?通过缓存,减少网络请求的数量和体积,页面加载和渲染更快;网络请求不稳定,加剧页面渲染不稳定性,所以通过缓存,保证页面优先加载;总结下来就是,使用缓存,可以让页面的加载、渲染更快,提高用户体验度。有哪些资源可以被缓存?一般为静态资源,如 css、js、img 等。强制缓存强制缓存流程初次请求,服务器返回资源,和 Cache-Control若服务器认为该资源可以被缓存,在响应头(Response header)加上 Ca

2022-05-10 22:25:52 517

原创 前端面试手写 -- (三)Promise.all 、Promise.race

实现 Promise.all需要注意的点:1、函数返回一个 promise 对象;2、promise.all 接收一个数组;3、接收的数组内元素可能为 promsie 或 常量,注意包装成 promise;4、针对数组返回的值,注意用数组下标去存储,保证返回结果顺序和数组一致。function all(arr){ //函数返回一个 promise 对象 return new Promise((resolve,reject) => { let count

2022-05-01 15:15:02 347

原创 leetcode 739.每日温度 -- 单调栈

单调栈

2022-04-29 10:00:42 341

原创 webpack 如何抽离公共代码和第三方库?

假设有下面三种场景场景一:index.js 和 other.js 文件同时引入 common.js 文件,打包的时候 index.js 和 other.js 中的 common.js 会打包两次。这种情况如何处理?场景二:index.js 和 other.js 两个文件同时引入第三方模块 lodash,若 lodash 体积过大,每次打包会打两次。这种情况又如何处理?场景三:index.js 和 other.js 两个文件同时引入第三方模块 lodash,若每次对 index.js 或 ot

2022-04-22 22:59:22 1621

原创 Webpack 如何抽离、压缩 CSS 文件?

webpack 抽离压缩 css

2022-04-13 11:12:50 1011

原创 Webpack 如何配置多入口?

关于 Webpack 配置,你了解吗?

2022-04-12 22:27:26 4639

原创 关于跨域,你知道几种解决方案?

跨域解决方案

2022-04-07 23:14:58 2054

原创 关于原型和原型链

这一次彻底理清楚原型和原型链。

2022-04-04 10:30:00 104

原创 关于 js 继承

关于 js 的继承,在大厂一面中出现频率很高,也是很基础很重点的知识,对于日常工作、项目的理解很有帮助,所以是必须要掌握的一点。js 的继承有很多方法,先记录三种,原型链继承、构造函数继承、组合继承,后面再更补其他方法。原型链继承核心点:让子类的原型对象指向新创建的父类实例。Child.prototype = new Father()优点:1、可以继承实例构造函数的属性;2、可以继承父类构造函数的属性;3、可以继承父类原型对象上的属性;缺点:某个实例修改了父类的属性或方法,会影响其他实例,其

2022-04-03 15:47:28 261

原创 剑指 offer 63. 股票的最大利润 -- 动态规划

题目描述题目分析1. 状态定义 dp[i]表示以i结尾的子数组的最大利润;2. 状态转移前 i 日的最大利润dp[i],等于前 i - 1 日的最大利润dp[i-1]和最后一日卖出的最大利润prices[i] - min 取最大值,min代表在价格最低时购入。即dp[i] = Math.max(dp[i-1],prices[i] - min)3. 初始化设置dp[0] = 0,首日利润为04. 返回值return dp[i-1]Code partvar maxProfit = f

2022-03-31 15:02:19 163

原创 关于Vuex中的数据流向

Vuex几个核心概念state 相当于Vue中的datagetter 相当于Vue中的computed,可以认为是store的计算属性mutations 相当于Vue中的methods,定义一些方法,唯一改变state数据的办法是提交mutationsactions 跟mutations类似,可以处理异步逻辑modules 主要解决的是多个store对外暴露的问题在src目录下创建store,包含以下js举例说明//state.jsexport default { coun

2022-03-29 19:24:58 1983

原创 new 一个对象的过程都发生了什么?

在这个过程中,new做了什么?1、创建了一个新对象2、设置原型链,让新对象的_proto_属性指向构造函数的prototype对象obj._proto_ = Func.prototype;man._proto_ = Person.prototype 3、让this指向新对象;4、使用新对象执行构造函数里面的代码,给新对象添加属性和方法;...

2022-03-29 08:30:00 1796

原创 一道经典面试题:从输入url到页面显示经历了什么?

这道题太经典了,因为它涉及到太多的知识点。重绘重排、回流重绘、浏览器渲染原理、event loop 和 TCP连接断开的方式等。一、DNS解析:url解析成ip地址和对应的端口号网络进程会先从DNS数据缓存服务器查找是否缓存过当前域名信息,有则直接返回,否则,会进行DNS解析成对应的ip和端口号。二、建立TCP连接:通过三次握手与服务器建立连接,然后进行数据传输第一次握手,发送SYN报文。客户端主动向服务器发送请求建立连接的报文SYN,客户端会随机初始化一个序列号x,然后把SYN的标志置为1,之

2022-03-28 18:13:59 4075

原创 Promise 基本使用

promise 基本使用

2022-03-25 17:08:21 1543

原创 前端面试手写题 -- (二)深拷贝

手写深拷贝

2022-03-22 00:28:44 1159

原创 前端面试手写题 -- (一)防抖、节流

手写防抖、节流

2022-03-21 18:47:04 536

原创 Leetcode105. 从前序和中序遍历构造二叉树 -- 递归

题目解题思路先序遍历顺序:根左右;中序遍历顺序:左根右;根据先序得到根节点位置;根据根节点位置 结合中序,得到左右子树;先序遍历、中序遍历中左右子树个数相同,可求出先序、中序中左右子树的下标;利用 map 求出根节点的位置,map始终存的是中序遍历元素(包括 leetcode106也是);画图!画图!画图!画图可清楚的看出来左右子树的下标。画图求左右子树下标根据左右子树在先序和中序遍历中的个数相同,得出:x - (preLeft + 1) = pIndex - 1 - inLe

2022-03-20 18:49:27 486

原创 二叉树总结 —— 前端面试考点

全面总结二叉树面试考点

2022-03-17 17:42:05 774

原创 算法设计 --- 动态规划详解

这一次彻底理解动态规划

2022-03-12 19:43:04 650

原创 剑指 offer14-I. 剪绳子 -- 动态规划 js版

js版动态规划解决剪绳子问题。

2022-03-11 18:17:17 187

原创 剑指 offer53-II. 0~n-1中缺失的数字 -- 二分查找

看到递增排序用二分法

2022-03-10 22:33:14 235

原创 剑指 offer53-I. 在排序数组中查找数字 -- 二分查找

二分查找和哈希表,两种方法解决此题。

2022-03-09 21:24:56 90

原创 剑指 offer11. 旋转数组的最小数字 -- 二分查找

二分查找的思想是:从数组的中间位置开始,如果中间元素正好是目标元素,则结束搜索;如果目标值大于或小于中间元素,则在大于或小于中间元素的那一半数组中搜索;重复1、2步;若未找到,return -1;二分查找用在有序数组中。二分查找的使用场景:查找一个数字;统计某个数字出现的次数。分而治之是算法设计中的一种方法。它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将结果合并以解决原来的问题。分而治之适用的场景:归并、快速、二分和反转二叉树。题目要求题目分析题目中给出的是半有序数组

2022-03-09 21:03:15 161

转载 剑指 Offer 62. 圆圈中最后剩下的数字 -- 约瑟夫环

约瑟夫问题是一个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉:从A开始报数,他报1;然后轮到B报数,他报2,被杀掉;接着从C开始新一轮的报数,他报1;接着又到了A,报2,被杀;最后剩下C,C胜利。本题也是这个思路,从0~n-1围城一个圈,从0开始计数,到第m个数字删除,求剩下的数字。...

2022-03-09 19:02:05 76

原创 剑指 offer35. 复杂链表的复制 -- JavaScript解法

题目要求思路分析用哈希表表示映射关系:键是原节点,值是复制的节点。第一次遍历链表,复制每个节点和 next 指针,并且保存原节点-〉复制节点的映射关系;第二次遍历,通过哈希表获得节点对应的复制节点,更新random指针;Code partvar copyRandomList = function(head) { let p = head; let map = new Map(); while(p){ map.set(p,new Node(p.val)) //用map来保存

2022-03-08 17:39:11 460

原创 剑指 offer27.回文链表 -- JavaScript解法

题目描述思路利用栈后进先出的特性,把链表所有元素入栈,再出栈,与链表节点一一对比,如果是回文链表,对比元素则相同,否则不是回文链表。步骤新建栈;链表所有元素入栈;栈顶元素依次出栈跟链表元素比较;所有元素相同,return true,否则 return false。Code partvar isPalindrome = function(head) { if(!head) return true; const stack = []; let p = head; let

2022-03-08 13:05:04 784

原创 剑指 offer22. 链表中倒数第k个节点 -- JavaScript解法

题目要求思路这道题可以用快慢指针的思路。快指针先走k步,之后快慢指针同步走,当快指针到链表最后一个节点时,慢指针正好在倒数第k个节点,因为两个指针始终相差k步,所以,慢–快之间的节点即为相差的k的元素;步骤定义快慢指针p1、p2;快指针先走k步,定义变量记录走的步数,快指针走完k步后,快慢指针同步走,直到快指针走到最后一个节点;注意,最后返回p1即可。Code partvar getKthFromEnd = function(head, k) { let p1 = head,p2

2022-03-06 18:13:24 407

原创 剑指 offer03. 数组中重复的数字 -- JavaScript解法

题目描述思路 && Code方法一,对数组进行排序,如果存在重复的元素,元素肯定相邻,从头到位扫描排序后的数组做对比即可。var findRepeatNumber = function(nums) { nums.sort((a,b) => { return a - b; }) for(let i = 0;i < nums.length;i++){ if(nums[i] === nums[i + 1]){ return nums[i]

2022-03-05 00:52:41 459

原创 Leetcode104. 二叉树的最大深度 -- JavaScript版

二叉树的概念:树中每个节点最多只能有两个子节点。树的一些常用操作,深度优先遍历DFS、广度(宽度)优先遍历BFS,二叉树的先、中、后序遍历。题目描述思路这道题要求找出数的最大深度,优先考虑使用DFS,DFS可以对根节点以及根结点的children进行深度查找,在查找的过程中,记录每个节点的层级,找到最大的即可。时间复杂度为 O(n),n为整棵树的节点树,因为每个节点都遍历到;空间复杂度为 O(n),n为最大深度。为什么空间复杂度是O(n),而不是O(1)呢?因为code中存在函数里面调用函

2022-03-03 14:52:48 715

原创 剑指 offer10. 斐波那契数列 -- JavaScript解法

什么是斐波那契数列呢?我们可以理解为它是这样的一个数列:1,1,2,3,5,8…n。该数列前两项相加等于下一项,以此类推。数学公式表示为:f(0) = 0 n = 0f(1) = 1 n = 1f(n) = f(n - 1) + f(n - 2) n>1斐波那契数列可以衍生为一些实际问题,比如爬楼梯问题、兔子繁殖问题等。题目要求解题思路看到公式,我们很快的可以这样写出:function fib(n){ if(n <= 0) return 0; if(n === 1)

2022-03-01 16:27:18 325

原创 剑指 offer11. 旋转数组的最小数字 -- JavaScript解法

看到题目还在想,这题还用考吗?直接 array.sort().shift() 不就解决了。其实还要从时间复杂度的方向去考虑问题,另外,直接用api,确定面试官不会把你赶出去吗??其实这道题主要考察二分查找。用二分查找的方法去找到数组中的最小元素。题目描述解题思路解题思路可以参考二分查找,设置low,high表示要搜索的最大最小值的下标,可以先找到数组的中间元素,比较中间元素 mid 和数组末尾元素 high 的大小,根据比较的大小来判断区间值的位置,如果mid 大于 high,说明后部分存在最小值,

2022-02-27 22:30:22 393

原创 剑指 offer50. 第一个只出现一次的字符 -- JavaScript解法

这道题相对来说比较简单,主要考察算法中的查找,这道题用哈希表就能解决。哈希表的优点是可以在O(1)的时间内找到某个元素,是效率最高的查找方式;缺点是需要额外的空间去实现哈希表。题目描述解题思路新建map,利用key,value属性;遍历字符串s,查看map中是否包含该字符,若包含,map中存入该字符,设置该值为flag,用来标识该元素已存在;若不存在,map中同样存入该元素,把i当作value设进去。遍历map,返回第一个值不为flag的元素即可。Codingvar firstUniqC

2022-02-27 21:15:38 370

原创 归并排序 —— 面试最常考的手写算法之三

归并排序的核心思想:分治。分治法是将原问题分解为几个规模较小但类似原问题的子问题,递归的求解这些子问题,然后合并这些子问题的解来建立原问题的解。 归并排序适合解决数据量较大的问题,相比其他排序,性能较好。算法思路分区:把数组劈成两半,再递归的对子数组进行“分”操作,直到分成一个个单独的数;合并:把两个数合并为有序数组,再对有序数组进行合并,直到全部子数组合并为一个数组;时间复杂度分区的时间复杂度 O(logN)合并的时间复杂度 O(n)时间复杂度O(n*logN)操作步骤新建一个空

2022-02-27 01:32:00 221

原创 二分查找 —— 面试最常考的手写算法之二

二分查找的前提是,数组必须是有序的。Array.sort()方法对数组元素进行排序,并返回数组。算法思路从数组的中间元素开始,如果中间元素正好是目标值,则结束搜索;如果目标值大于或小于中间元素,则在大于或小于中间元素的那一半数组中搜素;重复2,3步,若未找到,return -1。时间复杂度时间复杂度O(logN)每次使搜索范围缩小一半/劈成一半的问题,Time = O(logN)。CodingArray.prototype.binarySearch = function(item){

2022-02-27 01:11:30 293

原创 快速排序 —— 面试最常考的手写算法之一

快速排序是面试环节中最常考的经典排序算法之一。面试官常要求面试者能够手写快速排序的代码。算法思路在数组中选择一个数字,即“基准”;把数组分为两部分,所有比基准小的放在基准前面,比基准大的放在基准后面;递归的对基准前后的子数列排序。关于基准的选取?可以固定位置选取,如arr[0]、随机选取、也可以三分取中。时间复杂度分区的时间复杂度 O(n)递归的时间复杂度 O(logN)所以时间复杂度为 O(n*logN)CodingArray.prototype.quickSort = fu

2022-02-27 00:58:03 593

原创 剑指 offer09. 用两个栈实现队列 -- JavaScript解法

题目描述解题思路根据题目,可以操作两个“后进先出”的栈,实现一个“先进先出”的队列CQueue。思路:1、假设把a,b,c插入队列,可以把新进来的元素先push进栈1,得到[a,b,c],c位于栈顶;2、删除元素时,由于先进入队列的元素,先被压入stack1的底端,经过弹出和押入操作后,位于stack2的顶端,可以直接弹出。如,abc进入栈1后,stack1 = [a,b,c],删除元素时,理应先删除a,但栈是后进先出,所以栈2利用起来了,把元素从栈1pop出去再push进栈2,得到[c,b,

2022-02-26 00:21:31 315

原创 剑指 offer28. 对称的二叉树 -- JavaScript解法

题目描述解题思路使用BFS,层层遍历,判断节点是否相等。镜像对称,说明 左子树的左节点等于右子树的右节点,且左子树的右节点等于右子树的左节点。解题步骤root为null,直接返回true;构建checkSame(left,right)方法,传入根节点的左右子树;若左右子树都为null,说明对称,返回true;若左右子树都存在,则需要:root值相等 && 递归左右子树的child(child也需要满足镜像)Codingvar isSymmetric = functi

2022-02-25 18:54:37 256

原创 剑指 offer32. 从上到下打印二叉树 -- JavaScript解法

题目描述解题思路按层打印二叉树,考察的是广度优先遍历,也称宽度优先遍历。注意最后输出的是二维数组,需要把每一层的结点放入单独数组,最后push进需要返回的数组。广度优先遍历步骤新建一个队列 queue,把根节点入队;把队头出队并访问 queue.shift();把对头的children挨个入队;重复2,3步,直到队列为空。Codingvar levelOrder = function(root) { if(!root) return [] let queue = [roo

2022-02-25 16:37:10 375

空空如也

空空如也

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

TA关注的人

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