自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 为什么原型链顶端是null而不是undefined

2:该属性已经被声明但是没有被赋值,也不合理,因为原型链的顶端并不是动态赋值的,而是我们人为设置的。综上,较为合理的方案是null而并非undefined。

2024-04-03 16:46:43 161

原创 前端面试高频问答

因为定义成函数,每一创建新的组件实例时候都会开辟一新的内存空间,从而保证各个组件间的数据相互独立不存在引用关系,提高了组件的独立性和复用性闭包就是内部函数和外部变量形成的整体,内部函数可以访问到外部变量,类似于面向对象编程,因为它允许将函数与其操作的数据相关联起来,多用来封装私有变量/函数,在我实现防抖和节流的时候用到了闭包,同时弊端就是内存泄漏,解决方法时给函数的引用赋值为null。

2024-03-18 10:51:28 438

原创 Promise实现原理,Class版本

【代码】Promise实现原理,Class版本。

2024-01-29 16:45:48 97

原创 常见Es6规范

5:Promise用来解决回调地狱问题,(所谓回调地狱,就是回调函数层层嵌套,传统方式的回调函数一方面使得代码看起来层层推进不利于阅读,另一方面异常的处理也不便捷),Promise实质是一个构造函数,创建Promise实例过程可以通过resolve/reject改变内部状态,并可以通过.then()方式在状态改变时做出相应处理,同时.then()方仍返回一个Promise对象支持链式调用,和async,awiat语句结合使得异步语句看似同步语句,便于维护。

2024-01-26 15:21:00 385 1

原创 js中let,const,var的区别

如果再补充的话,let,const声明的变量也有变量提升的效果,只不过和var行为不一样,let,const变量提升体现在会将let,const声明的变量提升到当前代码块的最顶部,形成一个暂时性死区,无法在let/const声明前使用该变量,而var则会将声明的变量提升在当前作用于的最顶部,仅仅是变量提升,而初始化并不会提升,会在原来的位置执行。2.var声明的变量具有变量提升的效果,可以先使用后定义,而let,const不具备这样的性质。首先let,const是ES6中引入的新的变量的声明方式。

2024-01-26 11:32:44 215 1

原创 Promise基本功能实现

【代码】Promise基本功能实现。

2024-01-26 10:38:46 17 1

原创 手写Axios的实现原理

【代码】手写Axios的实现原理。

2024-01-25 15:39:24 334

原创 箭头函数为什么没有this指向

普通函数即可以被用来创建实例(1),又可以被调用执行一段指令序列(2),我们看到一个普通函数也不确定这个函数到底是用来来创建实例还是用来执行一段指令,所以箭头函数设计的初衷就是为了解决函数的二义性(创建实例,执行序列),为了解决这一问题,ES6引入了Class和箭头函数的概念,Class只能用过new关键字来创建实例,而普通函数只能执行一段指令序列,故箭头函数设计的初衷就是不应被创建实例的,因此它内部不存在this指向。js中一开始函数的设计是有缺陷的,因为一个普通函数可以有两种作用,

2024-01-25 15:32:07 454

原创 Vue中v-for为什么需要绑定key

key是虚拟dom唯一标识,当vue中的数据发生变化时,vue会根据新数据生成新的虚拟dom元并将新旧dom根据key值进行比对,1.key值相同的情况下比较内容,内容一致则将旧的dom元素复用,内容不一致则生成新的dom元素替换掉旧的dom元素,2.旧虚拟DOM中未找到与新虚拟DOM相同的key:创建新的真实dom随后渲染到页面。

2023-11-15 13:44:00 49

原创 修建二叉搜索树

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。递归代码如下TreeNode* trimBST(TreeNode* root, int low, int high) {

2022-05-25 17:52:09 120

原创 二叉搜索树的插入和删除;

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。我们可以先搜索再插入,搜索即为搜索到将要插入的位置,当搜素节点为空时,插入即可,那么此时插入位置可能时父节点的左儿子或右儿子,此时需要定义一个前驱节点pre来记录搜索位置的上一个节点,当要插入的值小于pre的值时,插入位置为pre的左儿子,相反则为pre的右儿子;class Solution {public:

2022-05-23 17:15:28 294

原创 二叉树的最近公共祖先

给出一个root节点,p节点,q节点;1.祖先的定义:节点root的左子树中含有p节点,右子树中含有q节点,则root为p和q的祖先;2:最近公共祖先:root的左,右子树中不含有p,q的最近公共祖先;最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”那么p,q的最近公共祖先root可有以下几种情况1:p,q存在于root的子树中且位于异侧(左右子树);

2022-05-19 17:38:36 1638

原创 验证一棵树是否为二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。可以递归中序遍历将二叉搜索树转变成一个数组,代码如下:vector<int> vec;void traversal(TreeNode* root) { if (root == NULL) return; traversal(root-...

2022-05-18 19:07:32 289

原创 判断一颗树是否为平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:树每个节点的左右两个子树的高度差的绝对值不超过 1 。输入:root = [3,9,20,null,null,15,7]输出:truebool isBalanced(TreeNode* root) { if(root==NULL)return true; return bi(root)==-1?false:true; } int bi(TreeNod.

2022-05-12 16:29:24 152

原创 通过前序中序,中序后序,前序后序来构造一二叉树

前序中序,以及中序后序可以确定唯一一颗二叉树,而前序后续是可以有多种情况,因为仅仅前序后续是无法确定根节点左右子树的问题;首先解决通过前序和中序来构建一颗二叉树的问题;前序=根节点+左子树+右子树中序=左子树+根节点+右子树;则我们可以通过查找根节点再中序中的位置来确定左子树再数组中的长度,进而确定右子树的长度,采用递归求解问题我们采用哈希表map来建立对中序一对一的键值对应关系;题目描述可参考力扣105题所描述如下给定两个整数数组preorder 和 inorder,其中...

2022-05-05 17:30:39 806

原创 删除线索二叉树的一个节点

力扣450题如下给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。力扣https://leetcode-cn.com/problems/delete-node-in-a-bst/submissions/根据二叉搜索树的性质如果目标节点大于当前节点值,则去右子树中删除;如果目标节点小于当前节点值,则去左子树中删除;如果目标节点就是当前节点,分为以下三种情况:其无左子:其右

2022-04-26 18:31:01 1114 1

原创 通过二叉树的前序和中序排序来构建一颗二叉树

给定vector<int>preorder,vector<int>inorder,分别存放二叉树前序和中序遍历的序列;让我们由此构建二叉树;思路(递归) O(n)O(n)二叉树前序遍历的顺序为:根左右二叉树中序遍历的顺序为:左根右递归建立整棵二叉树:先创建根节点,然后递归创建左右子树,并让指针指向两棵子树具体步骤如下:1、先利用前序遍历找根节点:前序遍历的第一个数,就是根节点的值;2、在中序遍历中找到根节点的位置 pos,则 pos 左边是左子树的中序

2022-04-25 20:45:17 1785

原创 二叉树的层次遍历

我们知道二叉树的层次遍历即为按照每一层从左到右的顺序遍历二叉树,先从最简单的层次遍历输出二叉树每个节点的值来说,需要用到queue队列的先进先出的原则来输出vector<vector<int>> levelcinout(TreeNode* root) { vector<vector<int>>vv; if(root==NULL)return vv; queue<TreeNode*>dui;

2022-04-21 16:40:48 1317

原创 合并k个升序链表

思路是先两两合并1.升序合并两个链表(递归算法)ListNode* merge1(ListNode* p1, ListNode* p2){ if(!p1) return p2; if(!p2) return p1; if(p1->val <= p2->val){ p1->next = merge1(p1->next, p2); return p1; }els

2022-04-14 19:21:45 46

原创 排序链表的实现

BiNode*Searchmid(BiNode*head){ BiNode*fast=head->next; BiNode*slow=head; while(fast!=NULL&&fast->next!=NULL){ fast=fast->next->next;slow=slow->next;}BiNode*c=slow;c->next=NULL;slow=slow->next;return slow;}B.

2022-04-14 19:14:43 34

原创 判断链表中是否是环形链表(c++双指针思想)

class Solution {public: bool hasCycle(ListNode *head) { ListNode*slow=head; ListNode*fast=head; while(fast!=NULL&&fast->next!=NULL){ fast=fast->next->next; slow=slow->next; .

2022-04-07 16:34:33 831

原创 c++寻找链表得中间节点(双指针思想)

利用双指针,定义一个快指针fast,慢指针slow ,均指向链表的头节点,快指针每次移动2步(fast=fast->next->next),慢指针每次移动1步(slow=slow->next),则每次循环快慢指针每次相差1步,循环为n/2次(n为链表的长度),则slow此时为链表的中间节点,此时当链表长度为偶数时,slow指针指向中间两个节点中的靠后节点Node*fast=head,*slow=head;while(fast!=NULL&&fast-next!=NU

2022-04-07 16:26:19 1268

空空如也

空空如也

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

TA关注的人

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