自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(94)
  • 问答 (1)
  • 收藏
  • 关注

原创 【LeetCode练习】55.跳跃游戏(中等|JS|贪心)

【LeetCode练习】55.跳跃游戏(中等|JS|贪心)

2022-08-05 16:28:59 839

原创 【LeetCode练习】19. 删除链表的倒数第 N 个结点(中等|JS|快慢指针)

【LeetCode练习】19. 删除链表的倒数第 N 个结点(中等|JS|快慢指针)

2022-08-02 22:30:03 264

原创 【LeetCode练习】17. 电话号码的字母组合(中等|JS)

【LeetCode练习】17. 电话号码的字母组合(中等|JS)

2022-08-01 22:25:59 1378

原创 【LeetCode练习】9. 回文数(简单|JS|双指针)

【LeetCode练习】9. 回文数(简单|JS|双指针)

2022-08-01 21:18:43 1270

原创 【LeetCode练习】2. 两数相加(中等|JS)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路刚开始试了把链表数字转为整数,但溢出了,那只能逐位相加了,考虑进位即可三、代码实现1.转为整数(不可行)var addTwoNumbers = function (l1, l2) { let l1num = 0, l2num = 0, l1n = 1, l2n = 1 while (l1 != null) { l1num += l1.val * l1n l1n *= 10

2022-03-02 15:38:26 824 2

原创 【LeetCode练习】剑指 Offer 45. 把数组排成最小的数(中等|JS|排序)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路很简单,两两拼接,如果ab>ba,那么b就放在a前面,确保每次拼接多一位后都是最小的就可以了,js一行搞定。三、代码实现var minNumber = function (nums) { return nums.sort((a, b) => `${a}${b}` - `${b}${a}`).join('')};...

2022-03-02 14:09:47 321

原创 【Vue相关】Vue的生命周期

Vue实例有一个完整的生命周期,即开始创建->初始化数据->编译模板->挂载Dom->渲染->更新->卸载等一系列的过程,官网给出的图如下,外加大佬的一些注明。beforeCreate:数据观测和初始化事件还未开始,此时data的响应式追踪、event/watcher都还没有被设置,也就是说不能访问到data、computed、watch、methods上的方法和数据。created:实例创建完成,实例上配置的data、computed、watch、meth

2021-12-28 15:24:43 471

原创 【Vue相关】单页面应用(SPA)与多页面应用(MPA)的区别

SPA(单页面应用) 只有一个主页面的应用,一开始只需要加载一次js、css等相关资源,所有内容都包含在主页面,对每一个功能模块组件化。页面的跳转,实际上就是切换相关组件,仅仅刷新局部资源。MPA(多页面应用) 有多个独立页面的应用,每个页面必须重复加载js、css等相关资源,多页面应用的跳转需要刷新整页的资源。对比如下:对比项SPAMPA结构一个主页面+许多模块的组件许多个完整的页面体验页面切换快,体验良好;但是初次加载文件过多时,需要做相关的调优网速慢的时候页面

2021-12-27 22:15:16 1081

原创 JS深拷贝的实现

原文再续,书接上一回(【JavaScript笔记06】赋值、浅拷贝、深拷贝),在这篇文章实现一下深拷贝的方法。首先来个最基本的拷贝,创建一个新对象,遍历需要克隆的对象,将需要克隆对象的属性依次添加到新对象上即可,但是面对多层的对象就不行了。let obj1 = { name:'jjy', age:23, child:{ id:4 }}function t1(source){ let cloneTarget = {} for(const

2021-12-16 15:06:32 528

原创 JavaScript中基本类型和引用类型

基本类型:String,Number,Boolean,Null,Undefined,Symbol引用类型:Object,Array,Function这两种类型最主要的区别在于声明变量时候内存分配不同,对基本类型而言,它的变量值是直接存储在栈内存中的,比如:var a = 10var b = ab = 20这里声明了一个变量a,它的值就直接放在了栈内存中,而复制则是直接拷贝了一份到b,改变b不影响a的值。对于引用类型而言,声明变量的时候,栈内存存储的是值所在的内存地址,而真正的值存放在堆内存

2021-12-15 16:04:13 1513 1

原创 为什么const定义的数组和对象的值可以变

总所周知在js中var、let和const的区别是,var只有全局作用域和函数作用域的的概念,如果用var在函数里面声明变量,则这个变量属于当前函数的作用域,而如果是在函数外的任何地方声明,则属于全局作用域。而let是块级作用域。var存在变量提升,无论var出现在作用域的哪个位置,这个声明都属于当前的整个作用域,在任何地方都能访问到,而let没有。var声明的变量可以重复声明,而let不可以。const一般用来声明常量,且其值不可变。但是在实际使用的时候会发现,const的值其实是可以"变"的

2021-12-15 11:09:55 4070

原创 简述HTTPS的工作流程

​ 客户端在使用HTTPS与WEB服务器通信时有以下几个步骤:客户端使用https url访问服务器,则要求web服务器建立ssl连接;web服务器接收到客户端的请求后,会将网站中的证书(证书中包含了公钥),传输给客户端;客户端和web服务端开始协商SSL连接的安全等级;客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站;web服务器通过自己的私钥解密出会话密钥;web服务器使用会话密钥来加密与客户端之间的通信。...

2021-12-09 14:32:41 3651

原创 【LeetCode练习】剑指 Offer 46. 把数字翻译成字符串(中等|JS|动态规划)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路用dp[i]来表示前i个数有多少种翻译的可能,初始情况下,dp[0]是空字符串,所以是1,dp[1]是前1个数,也就是第一个数,所以也是1,从前i=2数开始(注意这里i=2,在数字字符串中代表前两个数,dp数组比字符串数组多了一位),有以下两种情况:如果第i-1个数和第i-2个数(实际上就是当前看到的那个数字和前一个数字)组合起来大于25,那么此时前i个数的组合可能就和前i-1个数的组合可能数量相同,dp[i] = dp[i-

2021-12-08 16:23:50 716

原创 【LeetCode练习】剑指 Offer 62. 圆圈中最后剩下的数字(简单|JS|找规律)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路约瑟夫环问题(好高级),其实找规律就可以了,以题目为例,我们观察最后剩下的数字3在每一轮所处的位置。第一轮:0 1 2 3 4 0 1 2 3 4,删除2,此时3的下标为(0 + 3) % 5 = 3第二轮:3 4 0 1 3 4 0 1,删除0,此时3的下标为(1 + 3) % 4 = 0第三轮:1 3 4 1 3 4,删除4,此时3的下标为(1 + 3) % 3 = 1第四轮:1 3 1 3,删除1,此时3的下标为(0

2021-12-08 14:49:57 379

原创 【LeetCode练习】剑指 Offer 26. 树的子结构(中等|JS|递归)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路写在注释里面。三、代码实现var isSubStructure = function (A, B) { if (!B || !A) return false // 如果这次递归传进来的两个根节点相同,那么就从这两个根节点开始,对它们的左右子树对应来判断是否相等 if(A.val == B.val && helper(A.left,B.left) && helpe

2021-12-06 20:57:15 341

原创 【LeetCode练习】剑指 Offer 29. 顺时针打印矩阵(简单|JS|矩阵)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路使用四个指针指向上右下左四个方向,每当遍历完一个方向,就往内缩一层,比如上面第一行遍历完了,top指针就+1,进入第二行;此时来到右边第一列,把右边第一列遍历完,右指针就往左边移动一列,代码中就是-1,下指针和左指针同理,最后以结果数组的长度判断是否已经完成所有元素的遍历。三、代码实现var spiralOrder = function (matrix) { if(matrix.length == 0 ) {

2021-12-06 19:37:28 428

原创 【LeetCode练习】剑指 Offer 13. 机器人的运动范围(中等|JS|DFS、BFS)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路方法1:深度优先搜索,需要用一个二维数组来保存机器人是否进入过某个坐标[row,col],避免重复计算,先向一个方向搜索到底,再回溯到上一个节点,从这个节点开始沿另一个方向搜索。踩了一个坑:初始化二维数组的方式要注意(看注释)。方法2:广度优先搜索。。。(先鸽着,等学会了再来)三、代码实现方法1:var movingCount = function (m, n, k) { function cal(i) {

2021-12-04 15:47:26 353

原创 【LeetCode练习】剑指 Offer 10- I. 斐波那契数列(简单|JS|动态规划)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路方法1:递归不多说,但是会超时。方法2:动态规划也很简单,要注意的是不能只对最终结果取模,要对每一个结果都取模才行(一开始没发现踩坑了)。三、代码实现方法1:var fib = function (n) { if (n == 0) return 0 if (n == 1) return 1 return (fib(n-1) + fib(n-2)) % 1000000007 };方法2:v

2021-12-04 14:35:01 391

原创 【LeetCode练习】剑指 Offer 51. 数组中的逆序对(困难|JS|归并排序、递归)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路这里需要在归并排序的基础上进行改进。首先我们知道归并排序是将一个数组不断切分成左右两个数组,在数组内部进行排序后通过递归合并起来。在每个数组内部都有序的前提下,将左右数组同一个位置的数值进行大小比较。以[7,5,6,4]为例,当切分到[7]和[5],[6]和[4]时,每个单独数组内部都已经有序(现在每个数组只有一个数,也算有序),就对两个数组相同位置的值开始进行比较(1)7和5对比,由于都只有一个元素,此时构成了一个逆序对,记录+

2021-12-04 14:02:46 474

原创 【LeetCode练习】剑指 Offer 42. 连续子数组的最大和(简单|JS|动态规划)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路这题主要是要将大问题分解成小问题,用一个dp数组来记录在以i位置数字结尾的连续子数组的最大值,如果加上第i个位置的值(<0)之后变小了,则从第i个位置的数字重新开始算作连续子数组,如果加上第i个位置(>0)后dp[i]比dp[i-1]要大,则该计算可以连续下去。在代码中其实无需判断第i个位置的值是否大于0,只需要把两种情况都算上取最大值即可。循环结束后每个以第i个数字结尾的连续子数组的最大值都计算出来后,再取一遍dp最

2021-12-04 10:39:20 630

原创 【LeetCode练习】剑指 Offer 11. 旋转数组的最小数字(简单|JS|二分法)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路使用两个指针分别指向左元素和右边元素,计算中间元素下标,当middle>right说明最小元素在右半部分,当middle<right说明在左半部分,当以上两种情况都不是的时候则有可能最小元素就是left或者right本身(因为数组可以重复)。三、代码实现var minArray = function (numbers) { const len = numbers.length let [left, r

2021-12-03 15:50:15 186

原创 【LeetCode练习】剑指 Offer 03. 数组中重复的数字(简单|JS|哈希(Set))

【LeetCode练习】剑指 Offer 03. 数组中重复的数字(简单|JS|哈希(Set))文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路使用哈希,js中Set数据结构,判断set里面有没有当前数字,没有则加入set里面,有则直接返回结果。三、代码实现var findRepeatNumber = function(nums) { const s = new Set() for(const num of nums){ if(s.has(n

2021-12-03 14:38:37 518

原创 【LeetCode练习】剑指 Offer 38. 字符串的排列(中等|JS|递归)

【LeetCode练习】剑指 Offer 38. 字符串的排列(中等|JS|递归)文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路普通的递归实现即可。三、代码实现var permutation = function (s) { if (s.length == 0) return [''] // 递归退出条件 if (s.length == 1) return [s] const res = [] const len = s.lengt

2021-12-03 11:22:53 216

原创 JS判断一个对象是否为数组类型

总所周知JavaScript在一般情况下可以利用typeof来判断一个数据的类型,除了一些特殊情况,比如typeof null会输出object。这里要说的是另一种情况,用typeof判断数组也会输出object。首先创建一个数组let arr = [1,2,3]//或 let arr = new Array([1,2,3])1.instanceofconsole.log(arr instanceof Array) // true2.Array.isArray()console.log(

2021-11-29 21:41:29 347

原创 JavaScript 继承

文章目录一、原型链继承二、构造函数继承三、组合继承(原型+构造函数)四、原型式继承五、寄生式继承六、寄生组合式继承继承是面向对象编程的一种独特的编程方式,在JavaScript里面有六种实现继承的方法。父类function Animal(name){ this.name = name || 'animal' this.sum = function(){ console.log(this.name + '正在睡觉') }}Animal.prototype.ag

2021-11-26 15:42:49 431

原创 width&min-width&max-width的关系

min-width和max-width分别限制了元素的最小宽度和最大宽度,当浏览器缩小导致元素宽度小于min-width时,元素的width就会被min-width的值取代,浏览器出现滚动条来容纳元素,如果像下面这样写: .container { width: 600px; height: 300px; background-color: red; min-width: 500px; }实际上这样直接设定了width为600px,

2021-10-03 21:33:14 715

原创 BFC布局规则

BFC布局规则如下:内部的Box会在垂直方向上一个接一个的放置。内部的Box垂直方向上的距离由margin决定,要注意的是BFC内的块级元素依然会有外边距折叠,但可以在元素外用BFC来包裹,解决相邻元素间外边距折叠问题。BFC的区域不会与float的元素区域重叠。计算BFC的高度时,浮动子元素也参与计算。意味着可以利用BFC解决浮动带来的高度塌陷的文通。BFC就是页面上的一个独立容器,容器里面的子元素不会影响外面元素。意味着可以用给父元素设置BFC,解决margin-top塌陷的问题。..

2021-10-03 17:48:53 318

原创 子元素的margin-top作用在父元素上

这是因为css的外边距合并规则。两个相邻或嵌套的块级元素其外边距会合并为一个外边距,相邻的元素表现出两个外边距取大的那个,而嵌套的元素则表现为子元素设置margin-top,作用在父元素上。解决方案如下:将父元素设置为BFC。父元素设置padding-top,取代子元素设置margin-top,能达到同样的效果。...

2021-10-03 17:08:28 629

原创 JavaScript中的this小总结

之前也有一篇文章讲过JavaScript的this指向问题,不过感觉那篇讲得比较繁琐,这篇文章就简单再总结一下各种情况下this的指向,大体来说,this是指向代码调用者/执行者,所以在一个对象里面直接this,它指向的就是window:var age = 24var obj = { age:18, obj2:{ age:this.age }}console.log(obj.obj2.age) //24现在总结一下四种函数调用情况下this的指向。

2021-09-05 13:41:19 198 1

原创 JavaScript的事件循环(宏任务与微任务)

JavaScript是一门单线程语言,所以在同一时间都只有一个任务在执行,其异步操作时通过事件循环机制来实现的,其中异步操作又分为宏任务和微任务:宏任务微任务scriptprocess.nextTicksetTimeout、setIntervalPromise.then/catch/finallyI/O……大体上这些任务的执行顺序为主线程—>微任务—>宏任务,执行过程中有三个部分组成,分别是执行栈、宏任务队列(消息队列)和微任务队列,流程图如

2021-09-05 09:48:36 222

原创 浏览器渲染页面全流程

上文对浏览器渲染页面的过程只是一笔带过,本文将展开讲述一下浏览器拿到html/css等文件资源后是如何对页面进行渲染的,总体可以分为以下几步:解析HTML,构建DOM树。解析CSS,生成CSSOM树。合并DOM树和CSSOM树,生成render树布局render(Layout/reflow),计算各元素尺寸、位置。绘制render树(paint),绘制页面像素信息。浏览器将各层的信息发送给GPU,GPU将各层合成,显示在屏幕上。对于流程1,浏览器首先经过token

2021-09-02 16:39:41 705

原创 从输入URL到浏览器显示页面的过程

从输入URL到浏览器显示页面的过程从输入URL到浏览器显示页面的整个过程大概会经历以下几个步骤,根据本人的理解有些能展开叙述,有些则只能先一笔带过。一、找出域名和IP地址的对应关系总所周知,我们要访问一个网站,实际上是需要通过IP地址进行访问的,域名只是方便用户记忆,因此域名需要与IP地址一一对应。要找到这个对应关系需要经历以下步骤。查看本地hosts文件,查看是否有对应规则,若有,则直接使用该ip地址,若没有,则进入下一步。浏览器向本地DNS服务器发出一个DNS请求,说明需要查询该域名与ip地

2021-09-01 15:38:39 516

原创 【Javascript笔记07】ES6中的Class

目录ES6中的Class一、class的使用二、类的原型三、getter和setter四、this的指向五、继承ES6中的Class一、class的使用class就是类,是一般面向对象语言所具有的特性,类里面可以包含属性和方法,在JavaScript中也有类似的东西。在ES6之前,通过“类”的概念生成实例对象的方法是通过构造函数实现的:function Point(x, y) { this.x = x; this.y = y;}Point.prototype.toString = fu

2021-08-24 17:37:04 263

原创 【LeetCode练习】剑指 Offer 49. 丑数(中等|JS|动态规划)

一、题目描述二、解题思路根据定义可知,丑数是前面某个丑数*2或3或5,因此定义p2,p3,p5为前面三个丑数的下标,让其各自乘2、3、5,然后选最小的那个。之后将得到这个丑数的下标+1,下一轮计算就不会再得到这个丑数了。三、代码实现var nthUglyNumber = function(n) { let dp = new Array(n).fill(0) let p2=0,p3=0,p5=0 dp[0] = 1 for(let i=1;i<=n;i++){

2021-07-30 22:09:55 179

原创 【LeetCode练习】剑指 Offer 32 - II. 从上到下打印二叉树 II(简单|JS|层序遍历)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路层序遍历。有多少层,res数组就有多长,遍历新的一层就要在对应res的位置初始化空数组,按层序遍历的顺序把节点值push进去。三、代码实现var levelOrder = function(root) { let res = [] function bfs(root,depth){ if(root != null){ if(!res[depth]){

2021-07-30 19:35:53 199

原创 【CSS笔记】浮动

目录1.定位方式2.浮动的特点3.浮动的缺点4.清除浮动1.定位方式首先CSS中有以下五种定位方式:文档流定位:默认的定位方式,块级元素从上到下排列,行内元素从左到右排列。浮动定位:设置float:left/right,该定位方式会导致元素脱离文档流。相对定位:相对元素原来的位置偏移,原本的空间会被保留。绝对定位:脱离文档流,不占据页面空间。固定定位:将元素固定在某个位置,不随着滚动条而发生位置变化。2.浮动的特点引用大佬的总结,浮动有四个特点:脱标:脱离文档流。正常的div会像

2021-07-28 11:07:22 139

原创 【LeetCode练习】剑指 Offer 39. 数组中出现次数超过一半的数字(简单|JS|摩尔投票)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路自己一开始想到的思路很简单,利用到hasOwnProperty这个函数。高级的思路是摩尔投票,即用下一个数抵消上一个数出现的次数,当抵消到为0,则上一个数不是最大的数(不可能超过数组长度的一半),因此把下一个数当做是最大的数,以此类推。三、代码实现自己的思路var majorityElement = function(nums) { const len = nums.length / 2 let obj = {

2021-07-26 15:49:04 190

原创 【LeetCode练习】剑指 Offer 68 - II. 二叉树的最近公共祖先(简单|JS|递归)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路两种情况:p、q均不是最近公共祖先p、q其中一个是另一个的祖先因此通过递归由底至上寻找,记录根节点的左右子树是否都有p和q,若是,则该根节点就是最近的公共祖先。或者根节点是p或q时,该根节点的左右子树是否有另外的节点,若是,则该根节点是最近公共祖先。三、代码实现var lowestCommonAncestor = function(root, p, q) { let res const dfs = (r

2021-07-25 17:14:00 235 1

原创 【LeetCode练习】剑指 Offer 35. 复杂链表的复制(中等|JS)

文章目录一、题目描述二、解题思路三、代码实现一、题目描述二、解题思路首先是用Map数据结构创建一个原节点与原节点的值的对应关系,用map的原因是它的key值可以是任何类型,而object只能是简单类型。随后再次遍历原链表,将next和random也复制进去即可完成。三、代码实现var copyRandomList = function(head) { if(!head) return null let m = new Map() let node = head w

2021-07-23 11:16:14 95

原创 【JavaScript笔记06】赋值、浅拷贝、深拷贝

目录赋值、浅拷贝、深拷贝一、区别二、实现2.1 浅拷贝实现2.2 深拷贝实现三、总结赋值、浅拷贝、深拷贝一、区别在许多语言中都有浅拷贝与深拷贝,JavaScript也不例外,他们的区别很简单。赋值:对象赋值时,实际上赋的是对象在栈中的地址,而不是在堆中的数据,两个对象指向同一个存储控件,无论哪个对象发生改变其改变的都是同一个存储空间的内容。浅拷贝:创建一个新的对象,把源对象的值拷贝进来,这里会有两种情况:对于基本类型变量,拷贝的是它的值。对于引用类型变量,则拷贝的是内存地址。

2021-03-12 21:28:33 240

空空如也

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

TA关注的人

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