自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 浏览器相关面试题

输入url发生了什么?DNS解析(得到ip)关于cdn本地 DNS 服务器 将最终域名请求重定向到 CDN 服务。CDN服务返回一个响应最快的 CDN节点 的ip地址。CDN节点主要存储一些 不常更新的静态资源。ip => tcp三握四挥tcp => httpHTTP缓存:强缓存 和 协商缓存。加载、解析、渲染 页面加载:加载文件(如 HTML、JS、CSS、图片等)。解析:HTML加载后就会进行解析,然后拉取HTML中指定的CSS、JS等。

2022-01-16 19:34:05 1020

原创 css面试

如何让 子div在父div 水平垂直居中?水平居中: margin: 0 auto;垂直居中比较麻烦,是重点!若子元素宽高确定,子绝父相,子再偏移 子宽高的一半。若有宽高但未知,子绝父相,子上下左右为0,再 margin:auto;其余情况,则使用flex布局,给父元素设置 主侧轴 对齐方式。display: flex;justify-content: center;align-items: center;...

2021-12-01 20:31:27 115

原创 数组中出现次数超过一半的数字

数组中出现次数超过一半的数字思路一:计算每个数字出现的次数这是常规思路,遍历数组并记录当前数字出现的次数,可以采用hash表(js中用Map类型)来记录。/** * @param {number[]} nums * @return {number} */var majorityElement = function(nums) { let m = new Map(); for(let num of nums){ m.has(num) ? m.set(num, m.

2021-12-01 15:22:00 299

原创 前端可能用到的十个正则表达式

所有例子在 这个网站 测试结果。mastche语法例子:“{{obj.name}}"、"{{}}"规则:字符串中同时存在 “{{” “}}”。语法:/\{\{(.*)\}\}/g注意:如果上面那个例子,加上 ^ 和 $,当给定字符串为 “{{…}}” 是可以匹配的,但是若给定字符串 为 “1{{…}}”,则无法匹配。因为 ^ 和 $ 表示以 什么开头,以 什么结尾,通常匹配 完整的字符串是否符合条件。 如果不加,则可以匹配 该字符串的子串 是否满足条件。url例子https:/

2021-10-28 15:47:04 124

原创 二分查找算法

二分查找/** * @param {number[]} nums * @param {number} target * @return {number} */var search = function(nums, target) { let left = 0; let right = nums.length-1; while(left <= right){ let mid = Math.floor((left+right)/2); i

2021-10-15 18:37:30 53

原创 排序之归并排序

合并两个有序链表代码/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } *//** * @param {ListNode} l1 * @param {ListNode} l2 * @retur

2021-10-09 17:50:02 50

原创 树的查找路径问题

寻找树中两个节点的最近公共祖先思路用 两个数组 分别保存两个节点的查找路径,遍历两个数组就能找到最近公共祖先。代码/* * function TreeNode(x) { * this.val = x; * this.left = null; * this.right = null; * } *//** * * @param root TreeNode类 * @param o1 int整型 * @param o2 int整型 * @return int

2021-09-09 15:50:44 525

原创 两个链表相加

两个链表相加思路用两个栈分别存储两个链表,用 头插法 构建结果链表。代码/* * function ListNode(x){ * this.val = x; * this.next = null; * } *//** * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */function addInList( head1 , head2 ) { // w

2021-09-09 15:26:07 65

原创 大数的加法

大数加法思路列小学竖式,从后往前(个位,十位,百位...)计算。双指针代码/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */function solve( s , t ) { let res = []; let i = s.length - 1;

2021-09-03 17:42:52 53

原创 寻找两个链表的公共节点

寻找两个链表的公共节点思路双指针:最简单的方法可以两层循环,复杂度为O(mn);同样是双指针,可以将复杂度降为O(m+n);让两个指针走完自己的链表后,再走对方的。代码/*function ListNode(x){ this.val = x; this.next = null;}*/function FindFirstCommonNode(pHead1, pHead2){ let p = pHead1; let q = pHead2; whi

2021-09-03 17:38:22 214

原创 删除链表的倒数第n个节点

删除链表的倒数第n个节点思路快慢指针:让快指针先走n-1步,然后快慢指针同时走,当快指针走到链表末尾时,慢指针则指向倒数第n个节点。代码/* * function ListNode(x){ * this.val = x; * this.next = null; * } *//** * * @param head ListNode类 * @param n int整型 * @return ListNode类 */// 快慢指针,让快指针先走n-1步

2021-08-26 16:22:42 50

原创 合理的括号

判断括号是否合理思路用栈来模拟:遍历字符串中的每个字符,遇到左括号入栈,遇到右括号出栈。不证明合理,而是证明不合理。出栈时,需要判断栈是否为空,为空则一定不是合理的括号对。出栈时,若比对不匹配,也不是合理的括号对。遍历完成后,若栈中还有元素,则一定不是合理的括号对。代码/** * * @param s string字符串 * @return bool布尔型 */// 遇到左括号入栈,遇到右括号出栈匹配function isValid( s ) {

2021-08-26 15:55:10 78

原创 合并有序数组

合并有序数组思路双指针:分别指向两个数组的最大元素,从中选择较大的那个放入nums1的末尾。代码/** * * @param A int整型一维数组 * @param B int整型一维数组 * @return void */function merge( nums1, m, nums2, n ) { let p1 = m - 1, p2 = n - 1; let tail = m + n - 1; var cur; while (p1 >

2021-08-25 21:24:23 108

原创 判断链表的环

链表是否有环思路快慢指针:慢指针走一步,快指针走两步。有环快慢指针定会相遇,无环则快指针定能走到终点。代码/* * function ListNode(x){ * this.val = x; * this.next = null; * } *//** * * @param head ListNode类 * @return bool布尔型 */function hasCycle( head ) { // write code here let f

2021-08-25 21:03:07 58

原创 最大/最小连续序列和问题

思路f(i):返回以i为结尾的序列的最大和,以什么为开头不重要。子数组的最大累加和f(i) = f(i-1) > 0 ? f(i-1)+arr[i] : arr[i]代码/** * @param {number[]} nums * @return {number} */var maxSubArray = function(nums) { // pre: 以i-1为结尾的最大和 let max = nums[0]; let pre = 0; nu

2021-08-18 22:28:10 171

原创 两个栈模拟一个队列

两个栈模拟一个队列思路对于js来说,意味着只能使用push()和pop()方法,不能使用shift()方法。入队操作,直接压入入队栈(push)即可。出队操作需要优先检查出队栈是否有数据:若有,直接出栈。(pop)若无,需要从入队栈倒入(push)后再出栈(pop)。代码var CQueue = function() { this.inStack = []; this.outStack = [];};/** * @param {number} value

2021-08-10 16:17:34 61

原创 合并有序链表

合并有序链表递归思路代码/*function ListNode(x){ this.val = x; this.next = null;}*/// 返回合并后的头节点function Merge(pHead1, pHead2){ if(pHead1==null) return pHead2; if(pHead2==null) return pHead1; if(pHead1.val<pHead2.val){ pHead1.next

2021-08-10 16:10:42 61

原创 Vuex学习

为什么要用Vuex?如果只是父对子数据交互,那么应该考虑使用 props 进行单向传递;如果涉及到子组件向父组件的数据传递,那么应该考虑使用 $emit 和$on。涉及到非父子关系的组件,例如兄弟关系、祖孙关系,甚至更远的关系,他们之间如果有数据交互,那么应该使用Vuex来实现。怎么使用?准备Vuex实例安装vuex: npm install vuex --save。准备vuex实例: export default new Vuex.Store({}),传入的是一个对象,其中的属性有st

2021-08-05 14:55:57 422

原创 排序之partion函数

划分函数function partion(arr, left, right){ const pivot = arr[left]; while(left<right){ while(left<right && arr[right]>=pivot) right--; arr[left] = arr[right]; while(left<right && arr[left]<=pivot

2021-07-31 17:02:04 403

原创 数据结构设计之LRU

LRU思路用map来维护key和value,将最近使用的键值对放在map的末尾。为什么不用对象存储?因为对象中属性是没有顺序的(见文末的解释)。无论是put还是get,都需要更新当前的key为最近使用。最简单的办法就是,先把key删除,再增加该key。由于Map查找key、删除key、增加key的时间复杂度都是O(1),所以算法的整个时间复杂度为O(1)。代码/** * @param {number} capacity */var LRUCache = function(

2021-07-24 21:20:41 155

原创 回溯算法之括号生成

括号生成回溯思路重点是判断当前生成的括号是否合理:左括号数目一定大于等于右括号。代码/** * @param {number} n * @return {string[]} */var generateParenthesis = function(n) { let res = []; var fn = function(track, select){ let leftnum = track.split("(").length-1; le

2021-07-23 00:27:01 98

原创 promise(一)为什么要使用promise

为什么要用promise?promise是用来ES6中用来处理 异步操作 的。如果不使用promise,就需要使用 回调函数,此时如果有 多个有顺序 的异步操作,会造成 回调地狱。举个例子,如果有两个异步操作(执行需要时间),分别是 砍柴 和 烧水,我们不妨将他们定义为下面的两个函数:// 砍柴需要时间2s, 是个异步操作function kanChai(fn) { setTimeout(() => { fn(); }, 2000)}// 烧水需要时间

2021-07-22 23:10:59 2321 3

原创 回溯算法之子集、组合、全排列

求全排列思路track:记录一个全排列结果。选择列表(nums):选择一个满足条件的元素,加入到track中。代码/** * @param {number[]} nums * @return {number[][]} */// 返回nums数组的全排列var permute = function(nums) { let res = []; // 路径:记录在track中。 // 选择列表: 从nums中选。 // 结束条件:nums中所有数字都在tr

2021-07-19 18:08:27 82

原创 划分为k个相等的子集

划分为k个相等的子集思路nums数组中的每个数字都要选择进入到k个桶中的某一个。选择列表:若该桶能装下该数字,则该桶可以成为选择。代码/** * @param {number[]} nums * @param {number} k * @return {boolean} */var canPartitionKSubsets = function(nums, k) { let bucket = new Array(k).fill(0); let sum = nums.r

2021-07-09 18:28:10 86

原创 回溯算法之全排列/N皇后

全排列思路for 选择 in 选择列表: # 做选择 将该选择从选择列表移除 路径.add(选择) backtrack(路径, 选择列表) # 撤销选择 路径.remove(选择) 将该选择再加入选择列表代码/** * @param {number[]} nums * @return {number[][]} */// 返回nums数组的全排列var permute = function(nums) {

2021-07-08 03:05:30 55

原创 二叉树的层序遍历

二叉树的层序遍历思路常规思路,按顺序输出层序遍历的元素,不必在意该元素在哪一层上。// 普通的层序遍历:每次只取一个元素拓展// 先将树的根节点入队,// 如果队列不空,则进入循环// {// 将队首元素出队,并输出它;// 如果该队首元素有左孩子,则将其左孩子入队;// 如果该队首元素有右孩子,则将其右孩子入队// }这里的层序遍历,需要将该元素所处的层也记录下来。// 这里的层序遍历:每次取s_i个元素//

2021-07-06 21:08:40 42

原创 二叉树的序列化

二叉树的序列化思路序列化:前序遍历("root.val" + "," + "root.left" + "," + "root.right")*序列化的时候一定要带逗号,因为有可能数值为复数。反序列化稍微复杂一点若弹出的是数字,则新建root节点,先反序列化根节点的左子树,再反序列化根结点的右子树。若弹出的是#,则返回null空指针。坑1:反序列化时用.split(",")函数将字符串转为数组。坑2:即使遇到#,数组也要弹出该元素。代码/** * Definition for

2021-06-25 23:57:51 99

原创 二叉搜索树

二叉搜索树中第k小的元素思路中序遍历二叉搜索树,得到的是递增有序列表。代码/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===und

2021-06-22 18:58:30 30

原创 根据中序遍历序列构造二叉树

最大二叉树思路最大元素为根,左右子树分别递归地构造。代码/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ?

2021-06-17 17:50:52 1748

原创 二叉树展开为链表

二叉树展开为链表思路1、分别将root的左右子树拉平。2、左子树作为新的右子树,旧的右子树连接到新右子树的末尾。代码/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * th

2021-06-01 15:41:56 39

原创 填充完美二叉树的next指针

填充完美二叉树的next指针思路对于root节点,只要让root.left.next = root.right即可。但要让节点5和节点6相连,必须从各自的父亲入手,因此递归函数需要传入两个参数,设为node1和node2,连接node1和node2需要三步1、node1与node2相连:node1.next = node22、各自的左右孩子相连:node1.left.next = node1.right,node2.left.next = node23、node1的右孩子与node2的左孩子

2021-06-01 14:11:29 174

原创 翻转二叉树

翻转二叉树代码递归思路很简单,但容易犯错。/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : rig

2021-06-01 13:38:19 45

原创 判断回文链表

逆序打印链表var reverse = function(head){ if(head==null) return; reverse(head.next); // 后序遍历 console.log(head.val);}判断回文链表思路快慢指针反转中点之后的链表,然后双指针从两端往中间逼近。代码/** * Definition for singly-linked list. * function ListNode(val, next) { * th

2021-05-26 22:28:51 63

原创 k个一组反转链表

k个一组反转链表递归思路问题:反转以head为头的链表的前k个节点;子问题:反转以'3'为头的链表的前k个节点。递归函数:输入head和k,返回以head为头的前k个节点,并返回新的头节点。问题与子问题的连接:'1'这个节点.next = reverseKGroup('3'这个节点, k)通过遍历找到'3'这个节点。base case:遍历时如果不足k个,则直接返回head。代码/** * Definition for singly-linked list. * functi

2021-05-24 23:22:53 73

原创 反转固定区间的链表

反转一部分链表递归思路递归函数:输入一个节点head和一个区间[left, right],将「以left为起点,right为终点」的链表反转,并返回反转之后的头结点。if left!=1, 则head=head.next, 新的left减1, 新的right减1。if left==1, 则从头开始反转。从头开始反转, 也是一个递归函数,。代码/** * Definition for singly-linked list. * function ListNode(val, next)

2021-05-24 19:42:39 225

原创 反转链表前n个节点

递归思路注意后继者代码/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } *//** * @param {ListNode} head * @param {number} left *

2021-05-24 16:38:36 762 1

原创 HTML5和CSS3

![`head](https://img-blog.csdnimg.cn/20210514205025538.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDM4NjkzOQ==,size_16,color_FFFFFF,t_70)

2021-05-19 18:49:16 52

原创 css之特别效果

精灵图background: url() no-repeat x y字体图标配置字体图标库,并给需要字体图标的位置设计样式。font-family, content:引用图标库中的某个图标。color, font-size:修改字体图标样式。三角样式不设宽高,只设置边框粗细,形成正方形。绝对定位后,移到所需位置。给多余的三个边框颜色设置为透明。鼠标样式cursor: default | pointer | move | text | not-allowed表单outline

2021-05-17 12:50:54 67

原创 css易混淆知识点

背景图片和定位的图片第一种情况,图片超出了盒子的范围,背景图片没法做,只能用定位。第二种情况,既可以使用定位,也可以使用背景图片。其次,背景图片往往被"压住",而定位的图片往往"压住"别人。visibility和display设置了visibility: hidden的元素本质上还是占有文档流的位置,仍然具有宽高。而设置了display: none的元素本质上不占有文档流的位置,不具有宽高。实例下拉菜单往往脱离标准流,在鼠标经过的时候展示全貌。展示全貌的时候可能会 遮住 底下标准流中的元

2021-05-17 12:50:11 51

原创 js之DOM

onload事件onclick事件获取元素getElementById()getElementsByTagName()getElementsByName()获取元素属性.innerHTML.name.id.value.className

2021-05-17 12:47:21 67

空空如也

空空如也

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

TA关注的人

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