自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Javascript踩坑记录

在使用JS进行程序设计时,往往最终的结果会事与愿违,我将导致这种情况的因素称为坑点。1、Array.prototype.sort([fn])需要对数组原地稳定排序时,可以使用 arr.sort(fn), 但别忘了指定排序规则函数fn(a,b),否则会按元素的unicode码大小升序排序,如[1,2,10] => [1,10,2]2、Number类型运算js中无整数,只有IEEE754标准的双精度64位浮点数,因此做加减乘除运算的时候会很坑:// 第一个坑点0.1 + 0.2 不等于 0.3

2021-04-25 14:52:46 417

原创 21/09/12-LC周赛记录

T1: 5867. 反转单词前缀模拟即可,定义idx存分界点索引,如果索引越界,则完整返回;否则,使用双指针翻转前缀,即可T2: 5868. 可互换矩形的组数思路是,将数组每项进行约分,记作 val, 并计数,记作cnt,创建map<val, cnt>, 最后遍历map,使用组合数公式C(n, m)计算并求和即可T2.1: 约分使用欧几里得算法gcd(a,b)计算分子分母的最大公约数c,再分子分母两数同除c即可完成约分function gcd(a,b) { return b===

2021-09-12 18:03:31 143

原创 解决外边距坍塌问题

块级盒子在垂直方向上会有外边距坍塌的现象,为什么会有,需要去翻翻W3C文档外边距坍塌的情况有以下几种:(1)兄弟节点:如果是相向的margin,只有其中一个较大的margin会起作用(2)父子节点:如果是同向的margin,只有一个较大的margin会起作用解决办法有以下几种:(1)后者使用position定位(2)后者使用inline-block布局(3)使用BFC给其中一个套进BFC里面(4)使用flex布局,主轴设置为垂直的...

2021-08-25 19:54:09 97

原创 清除浮动方法梳理

当一个父容器中的子元素变为浮动后,父容器就会坍塌,下面的盒子也会就此补充上来因此,为了解决这样的问题,就有了清除浮动的几种方案:<!-- 清除浮动 --><div class="container"> <div class="inner"></div></div><style> html, body { margin: 0; padding: 0; } .co

2021-08-20 20:29:36 106

原创 js常见手写题梳理

1、使用XHR发起对 /api 发起GET请求 与 POST 请求:XHR: 创、开、配、达、错、发回调函数写法:let xhr = new XMLHTTPRequest();xhr.open("GET", url, true);xhr.responseType = "json";xhr.setRequestHeader("Accept", "application/json");xhr.onreadystatechange = function() { let state = xh

2021-08-11 16:26:52 132

原创 浏览器渲染过程梳理

当我们输入一个 www.google.com 到浏览器搜索框的时候,经过一系列通信链路,我们最终拿到了一份HTML文件。浏览器会使用这份HTML文件来 构建DOM、构建CSSOM、再将两者合并成Render树、再排版Layout、再绘制Paint。整个Web页面的构建过程我们可以通过监听 document 的 readystate 变化事件,变化过程为:构建DOM的过程就是将HTML字符串解析成DOM树构建CSSOM时是 将浏览器默认的样式,和用户自定义的样式构建将上述DOM和CSSOM的过程

2021-08-10 12:27:42 93

原创 [CSS] 选择器梳理

1、选择器选择器第一个要关注的点就是它们的优先级了:从位置上来看:内嵌 > 内联 > 外联 、 重复时后写的会覆盖掉先写的从选择器类型来看:后面跟!important的属性 > id选择器 > (class、属性、伪类)选择器 > (标签、伪元素)选择器 > *通配符选择器 > 浏览器的自带的默认属性另外选择器是可以组合的,如果在组合的过程中某个元素的样式属性出现了重复,我们就可以用求和的方式计算优先级,从而判断最终的结果样式。组合的方式有以下几种:

2021-08-09 18:12:00 62

原创 二叉树数学关系

1、完全二叉树最后一个非叶子节点:n/2 向下取整从0开始计数时,left = 2i+1right = 2i+2parent = (i-1)/2 向下取整从1开始计数时,left = 2iright = 2i+1parent = i/2 向下取整

2021-08-06 14:02:54 144

原创 [JS-OOP] 封装

ES5实现一个类的方式是使用函数,以及函数的3个内部对象:this、prototype、new.target,如:实例成员定义在构造函数内部,是每个实例各自维护的内容,格式为:this.a = 1;this.fn = function(){}原型成员定义在原型上,是每个实例共享的内容,格式为:Fn.prototype.b = 2;Fn.prototype.fn1 = function() {};用这种方法定义一个类未免会让代码显得过于零散,好在ES6给我们提供了一套class语法糖。cl

2021-08-02 13:19:25 59

原创 [JS-OOP] 继承

Js是通过原型链实现继承的,有以下几种方式:1、原型链继承:方式:子类 的 prototype 属性指向 父类 的 一个实例局限:(1)父类实例 的 实例属性 会变成 下方原型链 所有实例 的 原型属性(2)创建子类实例时,不能自定义源自父类的实例属性,源自父类的实例属性只能采用默认值function SuperType() { this.property = true;}SuperType.prototype.getSuperValue = function() { re

2021-08-02 12:37:01 97

原创 DOM练习

(1)创建Excel表格(2)设计一个todo-list(3)实现弹窗组件(4)红包模拟器(5)数字键盘(6)上传文件并不刷新页面

2021-07-31 20:32:40 69

原创 项目总结 Aparse

Aparse是一个钉钉小程序的富文本解析方案,是我在大二暑期的时候帮老师做一个钉钉小程序的时候借鉴微信小程序的解决方案实现的,现在来总结下。首先分析下项目目录:component 为核心代码:aParse.js 为 入口文件 和 出口文件htmlParser.js 解析HTML字符串为DOM 记为tmphtml2json 将tmp对象转换为jsonaParse.axml 渲染模板aParse.css 渲染模板对应的样式(需要自己写)整个工作流是这样的:...

2021-07-30 20:05:57 253

原创 计算机网络

1、TCP建立连接与断开连接TCP通信实质上是两个进程间的通信,除此之外进程之间的通信可以通过:管道、消息队列、共享内存、信号、信号量。补充见小林coding博客为什么要三次握手?实质上解释为什么多余三次,少于三次不行为什么要四次挥手?TCP与UDP的差异2、HTTP缓存机制3、DNS域名解析过程4、CDN加速的原理...

2021-07-30 15:06:41 67

原创 在浏览器中进行跨源通信

为了保证用户信息的安全,防止恶意网站窃取数据,浏览器拥有一项同源策略。同源策略规定,不同源的站点在 LocalStorage、SessionStorage、IndexDB、DOM上不能共享,AJAX请求不能发送。两个站点同源,具体是指 协议+域名+端口号 要相同。但是如果我们的一些这正常合法的逻辑中需要跨源通信或共享资源该怎么办呢?如果是共享存储内容(cookie、LocalStorage、SessionStorage)可以使用 postMessagepostMessage的使用方法为:假定 A

2021-07-29 16:13:22 120

原创 [javascript] 使用函数

N个指针函数名就是指向函数的指针因此一个函数可以有多个函数名可以通过 函数.name 获取N个参数function不关心参数数量,在函数内部可以使用 arguments 类数组对象来获取每一个参数(箭头函数无)也可以使用拓展运算符 …args 来获取参数,你拿到的args一定是形如这个格式的:[ 所有参数 ]js中函数不能重载,所谓重载就是不同函数签名就是两个函数,而 js 中是不同函数名才是两个函数,意味着后定义的函数会覆盖前一个函数不过可以以检查函数参数数量与类型+分类讨论的方式来模拟函

2021-07-24 12:28:44 73

原创 前缀和 & 差分

前缀和 & 差分 基于容斥思想。所谓容斥,就是为了解决不重不漏的计算,容斥的做法是:先不管重复全部计算,再逐个将重复计算的内容剔除。举个简单的例子:已知宽高,求正方形的周长。1、一维数组前缀和已知数组 nums, 定义前缀和数组 sum,使得 i ∈ [ 0, num.length-1 ] , 有 sum[i] 等于 nums中 0 到 i 的数据和。/* 思路: (1) sum[0] = nums[0] (2) sum[i] = sum[i-1] + nums[

2021-07-23 12:03:46 84

原创 使用vue-router自动生成导航菜单

当我们选用ElementUI作为页面开发的组件库,并打算创建一个如下的菜单表项:如果我们采用 ElementUI 库中的 el-menu 组件来实现的话,效果会很不错,但是代码的画风可能是这样的: <el-menu> <el-submenu index="1"> <el-menu-item index="1-1"></el-menu-item> <el-menu-item index="i-2"&

2021-07-19 16:17:16 3242

原创 容同学深夜洗牌竟然是因为..

某天深夜,我翻开了群聊记录,发现每个歪歪斜斜的气泡上都写着“随机“两个字。我横竖睡不着,仔细看了半夜,才从字缝里看出字来,满屏都写着四个字是“洗牌算法”!– 鲁迅解决思路要实现随机发送n个的需求,可以先将数据使用洗牌算法随机重排,然后选用连续的n个数据即可。洗牌算法有三种,对应三种思想–“抽牌”、“换牌”、“插牌”,后者都是对前者进行了不同程度上的优化,我们来看看这几种洗牌是怎么样实现的,适用于哪些场景。一、抽牌法 ( Fisher-Yates Shuffle)思路:从牌堆随机抽出,..

2021-07-19 11:37:52 76

原创 图解Git常用指令

之前使用git都是 add 、 commit 、 push 一套流程,完全当个上传下载器来使用,现在来较为系统的学习下git指令的用法,并画图总结下:最初状态我们约定一下,最初只有一条提交记录的状态,如图:git commit新建1次提交git branch Tomgit checkout Tommaster和Tom各自提交一次git merge Tomgit checkout Tom; git merge mastergit rebase Tom我们回到master 和

2021-07-19 11:27:37 126

原创 使用VueRouter自动生成导航菜单

我们在搭建Web的后台管理系统时,会选择 ElementUI 进行快速搭建,但是在某些场景下,单纯的使用组件是不能满足要求的。因为需求是在不断增加,不断变化的,如果像 ElementUI 给的示例去维护后台管理系统的菜单栏的话,代码会非常臃肿,维护起来也不是很方便:菜单是一个树形结构,VueRouter的配置项 routes 也是树形结构,每一个具体的路由都对应着一个页面,因此可以利用 routes 来配合 ElementUI菜单组件 动态生成菜单。大体思路如下:(1)拿到routes: this

2021-07-15 18:13:33 1141

原创 Javascript的一些坑点(二)

1、this指向问题当我们需要抽离一个类/对象的函数出来使用时,需要手动调整函数内部的this指向如:class Foo { constructor(num) { this.num = num; } getNum() { return this.num; }}let obj = new Foo();print(obj.getNum);function print(fn) { Promise.resolve() .then(function() { fn(); re

2021-07-12 12:21:52 65

原创 正确处理一个矩阵

在处理一个矩阵 matrix[][] 时,虽然很清楚接下来该怎么做,但最后的结果往往会报数组越界的错误,致使编程5分钟,排错2小时,极其浪费时间。究其原因,是没有理清矩阵与二维数组的对应关系,甚至与坐标轴混淆,且听我一点一点分析。首先,我们需要创建一个二维数组 arr 来存储一个m*n的矩阵 matrix,有多种方法可以参考前文 Javascript的一些坑点,这里使用es6的简介写法let arr = new Array(m).fill(0).map(v => new Array(n).fil

2021-07-11 11:55:04 99

原创 LC每日一题

不能靠CV完成每日一题,也不要做完就完事了,因此来这里记录下吧!(1)二叉树的层次遍历同样做法的题目:102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的前序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点指针II(2)和相同的二元子数组同样做法的题目:leetcode 724. 寻找数组的中心索引leetcode 560. 和为K的子数组leetcode1

2021-07-09 15:01:27 102

原创 回溯思想解决排列组合子集问题

回溯思想回溯的本质就是枚举每一个可能的解,枚举的过程与dfs的路线是一致的,因此最重要的一步就是将问题求解过程抽象出一颗决策树,并给出每个结点上所需要的状态,以及变化。当一个问题只能通过枚举解决时,可用回溯。当一个问题使用回溯解决时复杂度过高时,需要找到有效的剪枝方法,才可使用。以下是在(有重复元素)排列组合子集问题上的应用1、求全排列LC 全排列伪代码1、定义回溯中的状态:结果数组res,可能的排列arr2、定义搜索终止条件:arr长度等于nums的原始长度时,将arr加入res3、

2021-07-04 15:39:47 109

原创 理解闭包,应用闭包

PS:从onenote复制出来就变成图片了,神奇

2021-07-04 13:46:34 44

原创 使用Promise进行异步编程

1、Promise调用链Promise是一个有限状态自动机Promise在收到既定事件后,会根据预设的规则进行转换状态,转换完后执行相应回调Promise 拥有3种状态PENDING 初始状态FULFILLED 已兑现REJECTED 已拒绝转换规则fulfill / resolve 将 PENDING 转换为 FULFILLED (已敲定)reject 将 PENDING 转换为 REJECTED (已敲定)处于已敲定 settled 状态下的 Promise 的状态

2021-07-03 23:40:17 442

原创 AcWing 787. 归并排序

let tmp = [];function mergesort(nums, L, R) { if(L < R) { let mid = (L+R) >> 1; mergesort(nums, L, mid); mergesort(nums, mid+1, R); let i = L; let j = mid+1; let k = 0; while(i<=mid &

2021-07-03 19:16:32 45

原创 JS输入输出模板

单行输入 可以无需 cnt多行 且 每行有固定作用 的输入 需要对cnt的值特判并处理const readline = require("readline");const R = readline.createInterface({ input: process.stdin, output: process.stdout});const LOG = console.log;let cnt = 0;R.on("line", function(line) { line =

2021-07-02 14:33:13 163

原创 AcWing 785. 快速排序

注意处理输入时要用 trim 去除两边空格function quicksort(nums, L, R) { if(L < R) { let i = L-1; let j = R+1; let x = nums[L+R >> 1]; while(i < j) { do i++; while(nums[i]<x); do j--; while(nums[j]&g

2021-07-02 10:48:56 50

原创 AcWing 1. A + B

https://www.acwing.com/problem/content/description/1/用 JS 处理单行输入输出const readline = require("readline");const R = readline.createInterface({ input: process.stdin, output: process.stdout});const log = console.log;R.on("line", function(line) {

2021-07-02 09:38:36 129

原创 [链表] 142. 环形链表 II

https://leetcode-cn.com/problems/linked-list-cycle-ii/上面漏了两个字,“只要res与slow” --> “只要res与slow相遇”代码如下:/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } *//** * @param {ListNode

2021-05-18 00:27:47 37

原创 [链表] 141. 环形链表

链表的题就是找数学关系https://leetcode-cn.com/problems/linked-list-cycle/代码如下:/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } *//** * @param {ListNode} head * @return {boolean} */va

2021-05-18 00:14:23 35

原创 第52场双周赛

5742. 将句子排序/** * @param {string} s * @return {string} */var sortSentence = function(s) { let arr = s.split(" "); let map = new Map(); for(let w of arr) { let [num] = w.split("").splice(-1,1); let tmp = w.split("");

2021-05-16 09:34:02 58

原创 [二分查找] 1095. 山脉数组中查找目标值

https://leetcode-cn.com/problems/find-in-mountain-array//** * // This is the MountainArray's API interface. * // You should not implement it, or speculate about its implementation * function MountainArray() { * @param {number} index * @retur

2021-05-15 22:27:33 37

原创 [DP] 零钱兑换

零钱兑换属于是完全背包问题https://leetcode-cn.com/problems/coin-change/代码实现:/** * @param {number[]} coins * @param {number} amount * @return {number} */var coinChange = function(coins, amount) { let dp = []; dp[0] = 0; for(let c of coins) dp[c] = 1

2021-05-15 22:22:44 46

原创 [回溯] 77、组合

https://leetcode-cn.com/problems/combinations/submissions/代码实现如下:/** * @param {number} n * @param {number} k * @return {number[][]} */var combine = function(n, k) { let nums = []; for(let i=0;i<n;i++) nums.push(i+1); let res = [];

2021-05-14 12:15:33 36

原创 [回溯] 78、子集

https://leetcode-cn.com/problems/subsets/submissions/代码实现如下:/** * @param {number[]} nums * @return {number[][]} */var subsets = function(nums) { let res = [[]]; dfs(nums, [], res, 0); return res;};function dfs(nums, arr, res, cur) {

2021-05-14 12:01:18 38

原创 [回溯]46. 全排列

https://leetcode-cn.com/problems/permutations/伪代码1、定义回溯中的状态:结果数组res,可能的排列arr2、定义搜索终止条件:arr长度等于nums的原始长度时,将arr加入res3、画出选择树实现/** * @param {number[]} nums * @return {number[][]} */var permute = function(nums) { let res = []; dfs(nums, res,

2021-05-10 21:37:05 40

原创 尾递归优化

尾递归是递归的一种,特点是函数执行的最后一步是返回函数自身调用,如:function fn(a, b) { if(b === 1) return 1; return fn(a-1, b-1);}这意味着在将下一个函数B加入递归调用栈前,可以将前一个函数A弹出销毁,因为B无需A的执行上下文环境。拿求前N项和来说,N=3非尾递归写法function recursion(n) { if(n === 1) return n; return recursion(n-1) + n;}

2021-05-08 00:23:42 75

原创 [滑动窗口] 3. 无重复字符的最长子串

链接https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/滑动窗口 + 哈希集合伪代码:(1)用left、right界定滑动窗口,使得滑动窗口中的序列片段不含有重复字符串(2)由1得,初始状态为 left = right = 0,终止状态为 right = s.length-1(3)结合题意,该滑窗移动方式是 一格一格移动(4)可以使用数据结构 Set 来判断滑窗序列中是否有 重复字符

2021-05-07 19:37:44 48

空空如也

空空如也

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

TA关注的人

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