- 博客(98)
- 资源 (2)
- 收藏
- 关注
原创 javaScript的序列化与反序列化
总的来说,javaScript对的序列化过程是对象的解析,以字符串形式存储对象结构。反序列化是解析字符串,还原成对象。理解这个过程,有助于我们解决复杂问题。
2024-02-02 01:31:32 2509
原创 render函数的基本实现
tag和children是必要属性,tag表示标签名,children表示该标签的子属性。通过两年半的学习发现是需要创建dom的,然后将创建的dom挂在根dom上就完成渲染了。在学习vue入门时3,一直有一个疑惑如何把虚拟dom转换成真实dom的。现在猜想,假设虚拟dom长这样,表示要渲染的内容。使用时将需要渲染的对象和根dom传进去就能完成渲染。
2024-01-28 15:01:58 474
原创 BM65 最长公共子序列(二)
给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列数据范围:要求:空间复杂度示例1输入:复制返回值:“123456”
2023-12-21 13:35:10 508
原创 BM61 矩阵最长递增路径
给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。这个路径必须满足以下条件: 1. 对于每个单元格,你可以往上,下,左,右四个方向移动。你不能在对角线方向上移动或移动到边界外。2. 你不能走重复的单元格。即每个格子最多只能走一次。
2023-12-17 16:57:13 1048
原创 微信小程序吸顶布局
css3的 position属性有一个 sticky值。粘布局,相对于父元素布局。设置的top值只在粘性布局生效的时候生效。官方有个sticky插件,装依赖后,发现引用组件报错,相对当路径也不可以。小程序对css3的支持是比较全面的可以放心使用。
2022-12-30 10:43:05 1046 1
原创 BM58 字符串的排列
这一题其实类型与56题的全排列组合,需要排列的类型由数字数组变成了字符串。因为字符串也是可遍历的写法,与56题基本相同。2,声明dfs方法,这里还是使用了数组来缓存,当数组最大长度等于原始字符的时候,把缓存数组的值变成字符串,取出来,去重之后存到结果数组。要求:空间复杂度 O(n!),时间复杂度 O(n!输入一个字符串,长度不超过10,字符只包括大小写字母。1,需要声明3个变量,分别保存结果标记,和去重。数据范围:n < 10n
2022-10-21 22:47:22 364
原创 BM57 岛屿数量
题目给出的是一个二维数组,可以把其想象成一个平面图,把总数组里面的索引想象成y轴, 把子数组想象成x轴,那么每一个值都有一个坐标。我们要探索海洋中的岛屿,值为1的为陆地,值为0的为海洋,相邻的陆地为同一块岛屿,我们需要探索每一个点。当我们到达陆地之后,需要判断其上下左右是否还是陆地,如果是陆地,那么进入该陆地继续判断。同时标记已探索过的陆地,避免重复探索,当遇到的陆地是我们已经探索过的,就不探索该陆地,直接跳过。给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。
2022-10-21 10:54:43 475
原创 BM54 三数之和
在找的过程中如果扫描的值之和取反后大于当前的值,那么需要将左指针向右移动,因为我们的数据是排序好的,越往右越大,反之越往左越小。第50题是两数之和,这一题是三数之和,那如果是五数之和,十数之和呢,总不能用五个指针十个指针,最好的方法应是,先找到有多少种组合,计算每种组合相加的结果得到我们想要的答案。先使用了哈希表的解法,根据第50题《两数之和》思路,使用哈希表先保存了所有值,同时将在数组中的位置也存了下来,利用不同索引位和三数之和等于零这个条件来判断,但是这样输出后的结果和答案的位置不一样,卡在了13题。
2022-10-09 21:10:53 467
原创 BM53 缺失的第一个正整数
这里一开始理解了好久,没看懂啥意思。就是在数组找没有出现的正整数。所以我们只需要统计整数就可以了。然后判定没有的最小正整数。自然数里最小正整数为1。二,从1开始判断Map中是否有该数,每次加一。通过map的has检查,如果没有循环中止。那么该值就是最小正整数。给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数。进阶: 空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
2022-10-06 23:25:31 227
原创 BM52 数组中只出现一次的两个数字
数据范围:数组长度 2\le n \le 10002≤n≤1000,数组中每个数的大小 0 < val \le 10000000
2022-10-06 23:00:55 198
原创 BM51 数组中出现次数超过一半的数字
这一题类似于 《统计字符串中出现最多的字符》,还是使用表来统计数组中每个数在数组红出现的次数。获取到出现次数最多的字符,判读该字符出现的次数是否大于数组长度的一半,如果是返回该字符。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。保存到表中后,获取到最大出现次数,但是,发现光获取最大出现次数还不够,同时还要获取到该字符。给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
2022-10-06 22:49:33 179
原创 BM50 两数之和
为了提高性能,将遍历过的数值用一个表来保存当前值和索引。每次遍历的时候就根据,当前值与target的差值,去表中查找是否有该值,如果有就判断达成题意,然后取出保存的索引和当前索引,排序后返回。看上去是挺简单的,但是在实际计算中,数组中的任意两个数都需要加一遍,计算量其实非常大,复杂度不能太高。给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
2022-10-06 22:20:52 155
原创 BM49 表达式求值
感觉这一题是相对较难的,难点在于优先级运算。为了方便通过使用了api, 有时间可以慢慢研究。数据范围:0\le |s| \le 1000≤∣s∣≤100,保证计算结果始终在整型范围内。要求:空间复杂度: O(n)O(n),时间复杂度 O(n)O(n)原生的方法封装起来还是相对较难的,封装就是为了简化使用;请写一个整数计算器,支持加减乘三种运算和括号。
2022-10-06 21:39:55 172
原创 BM48 数据流中的中位数
分析: 根据题意获取数据流的中位数,由Insert()方法读取数据流,使用GetMedian()方法获取数据流的中位数,题目最后是同时导出这两个方法,也就是说这两个方法是每次都要执行的。数据范围:数据流中数个数满足 1 \le n \le 1000 \1≤n≤1000 ,大小满足 1 \le val \le 1000 \1≤val≤1000。3, 使用GetMedian()方法,读取中位数,如果数组长度是奇数,就直接取中位数。2,Insert()方法中,将每次传入的数存储到arr数组中,做好排序,
2022-10-05 21:00:36 132
原创 BM47 寻找第K大
数据范围:0\le n \le 10000≤n≤1000, 1 \le K \le n1≤K≤n,数组中每个元素满足 0 \le val \le 100000000≤val≤10000000;a 表示原数组, n, 新添加的数,这个数也要添加到a数组中,然后排序, K,数组中的第几大。给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。2,该数组是不需要去重的,即便是有重复的,也是可以的,只要找到对应位置的数就可以了。
2022-10-05 12:54:14 225
原创 BM46 最小的K个数
给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。数据范围:0\le k,n \le 100000≤k,n≤10000,数组中每个数的大小0 \le val \le 10000≤val≤1000。2, 无须排序,直接找到最小值将其提取出来,并把该值重原数组中删除。要求:空间复杂度 O(n)O(n) ,时间复杂度 O(nlogk)O(nlogk);使用数组API简单暴力省事。
2022-10-05 11:28:13 127
原创 BM45 滑动窗口的最大值
例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。窗口大于数组长度或窗口长度为0的时候,返回空。
2022-10-05 10:59:06 228
原创 模拟事件总线
单页面应用,页面不刷新,页面定义的变量和函数是一直保持的,vue中的全局事件总线是把要触发的回调方法挂到了vue全局变量上。先监听,然后在需要的地方触发。存在于全局变量,子孙组件通过引用都可以访问到。简单理解为,............
2022-08-30 18:02:19 255
原创 js异步变同步阻塞等待执行
在某些场景下,我们需要执行一些有等待时间的同步操作,可能会想到用定时器,是的就是用定时器。为什么要这么做,在stop函数的作用域下,如果有多个执行逻辑,且不能修改原有的逻辑代码,而新增加逻辑必须要等待,那么这种情况下,阻塞stop函数内部执行是可行的。......
2022-07-08 11:57:14 2047
原创 ts环境搭建
1, 安装 node ,前端标配,不明百度查,2, 全局安装 ts3,查看版本4, 选择项目文件生成 package5, 修改配置文件找到tsconfig.json ,打开圈出来这段注释,作用是编译之后的 js文件放置目录,设置要编译的 ts 文件目录,这一段需要手动添加。 作用是编译该目录下的 ts。找到 package.json。项目配置文件 把 npm run 命令设置成 tsc ,同时用 watch 监听 ,可以做到实时编译。以上就是快速使用 ts 的简单方法......
2022-06-22 14:45:55 1534 3
原创 BM44 有效括号序列
描述给出一个仅包含字符’(‘,’)‘,’{‘,’}‘,’[‘和’]',的字符串,判断给出的字符串是否是合法的括号序列括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。数据范围:字符串长度 0\le n \le 100000≤n≤10000要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n);思路: 给到的是一个字符串,判断是否按照正确的方式关闭。就是左边的要对应右边的 ( , [ ,{,}, ],),如果是相互包裹的里面也应该是闭合的
2022-06-08 22:46:33 155
原创 BM39 序列化二叉树
描述请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#)二叉树的反序列化(Deserialize)是指:根据某种遍历顺序得到的序列化字符串
2022-05-15 00:00:00 107
原创 BM36 判断是不是平衡二叉树
描述输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。样例解释:样例二叉树如图,为一颗平衡二叉树注:我们约定空树是平衡二叉树。数据范围:n \le 100n≤100,树上节点的val值满足 0 \le n \le 10000≤n≤1000要求:空间复杂度O(1)
2022-05-14 12:24:39 144
原创 BM35 判断是不是完全二叉树
描述给定一个二叉树,确定他是否是一个完全二叉树。完全二叉树的定义:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。(第 h 层可能包含 [1~2h] 个节点)数据范围:节点数满足 1 \le n \le 100 \1≤n≤100样例图1:样例图2:样例图3:思路: 最好实现的方式就是层序遍历,每一层,每一层的找,根据完全二叉树的介绍,除叶子节点外,其他各层都达到了最大节点数,且叶子节点有一到两个节点,集中
2022-05-05 22:35:46 376
原创 BM34 判断是不是二叉搜索树
描述给定一个二叉树根节点,请你判断这棵树是不是二叉搜索树。二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。例:图1图2数据范围:节点数量满足 1 \le n\le 10^4 \1≤n≤104,节点上的值满足 -2^{31} \le val \le 2^{31}-1\−231≤val≤231−1思路: 观察搜索二叉树的判断方式,和中序遍历的遍历顺序相同,那么在这个过程中是否就可以用val来做比较呢,是可以的。先保存前一个,和当前对比,如
2022-05-02 17:52:49 313
原创 BM33 二叉树的镜像
描述操作给定的二叉树,将其变换为源二叉树的镜像。数据范围:二叉树的节点数 0 \le n \le 10000≤n≤1000 , 二叉树每个节点的值 0\le val \le 10000≤val≤1000要求: 空间复杂度 O(n)O(n) 。本题也有原地操作,即空间复杂度 O(1)O(1) 的解法,时间复杂度 O(n)O(n)比如:源二叉树镜像二叉树思路: 交换子树的左右位置,就可以达到题目要求的效果function Mirror( pRoot ) { // write code
2022-05-02 17:01:10 561
原创 BM30 二叉搜索树与双向链表
描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示数据范围:输入二叉树的节点数 0 \le n \le 10000≤n≤1000,二叉树中每个节点的值 0\le val \le 10000≤val≤1000要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)注意:1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继2.返回链表中的第一个节点的指针3.函数返回的T
2022-05-02 14:51:22 414
原创 BM29 二叉树中和为某一值的路径(一)
描述给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是指没有子节点的节点3.路径只能从父节点到子节点,不能从子节点到父节点4.总节点数目为n例如:给出如下的二叉树,\ sum=22 sum=22,返回true,因为存在一条路径 5\to 4\to 11\to 25→4→11→2的节点值之和为 22数据范围:1.树上的节点数满足 0 \le n \le 10
2022-05-02 13:53:13 110
原创 BM28 二叉树的最大深度
描述求给定二叉树的最大深度,深度是指树的根节点到任一叶子节点路径上节点的数量。最大深度是所有叶子节点的深度的最大值。(注:叶子节点是指没有子节点的节点。)数据范围:0 \le n \le 1000000≤n≤100000,树上每个节点的val满足 |val| \le 100∣val∣≤100要求: 时间复杂度 O(n)O(n)思路: 其实本题的答案在上一题就已经给出了,上一题我们通过层序遍历获得了每一层的节点,那么最大深度就是最大节点层数;代码:function maxDepth( roo
2022-05-02 12:23:58 549
原创 BM27 按之字形顺序打印二叉树
描述给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| <= 1500∣val∣<=1500要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树之字形层序遍历的结果是[[1],[3,2],[4,5]]思路:上一题做了程序遍历的取值,这题可以延申。根据要求,交替遍历
2022-04-28 22:29:40 577
原创 BM26 求二叉树的层序遍历
描述给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)例如:给定的二叉树是{3,9,20,#,#,15,7},该二叉树层序遍历的结果是[[3],[9,20],[15,7]]数据范围:二叉树的节点数满足 1 \le n \le 10^5 \1≤n≤105思路:前面写了,前序遍历,中序遍历,后序遍历,其实方法是一样的,只是在不同的位置将值取出去,题目要求的返回值是二维数组,我们要在每一层遍历的时候添加一个数组,因为操作的是同一个数组,最好返回就是一个二维数组;f
2022-04-28 22:04:13 722
原创 js自定义浏览器下拉刷新
之前做了一个移动端的项目,使用的是自带的下拉刷新,暴露的方法有限,感觉效果不怎么好。于是看看能不能手做一个;思路就是,拖动 => 回弹;css部分 body{ margin: 0;; padding: 0; } .page{ position: absolute; width: 300px; height: 500px; background-color: mediumaquamarine; border: 2px solid
2022-04-19 13:18:18 530
原创 BM25 二叉树的后序遍历
描述给定一个二叉树,返回他的后序遍历的序列。后序遍历是值按照 左节点->右节点->根节点 的顺序的遍历。数据范围:二叉树的节点数量满足 0 \le n \le 100 \0≤n≤100 ,二叉树节点的值满足 1 \le val \le 100 \1≤val≤100 ,树的各节点的值各不相同样例图递归function postorderTraversal( root ) { // write code here const res = []; if(!ro
2022-04-17 20:05:52 431
原创 BM24 二叉树的中序遍历
描述给定一个二叉树的根节点root,返回它的中序遍历结果。数据范围:树上节点数满足 0 \le n \le 10000≤n≤1000,树上每个节点的值满足 0 \le val \le 10000≤val≤1000进阶:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)递归版function inorderTraversal( root ) { // write code here const res = []; if(!root) return res;
2022-04-17 19:55:49 383
原创 BM23 二叉树的前序遍历
描述给你二叉树的根节点 root ,返回它节点值的 前序 遍历。数据范围:二叉树的节点数量满足 1 \le n \le 100 \1≤n≤100 ,二叉树节点的值满足 1 \le val \le 100 \1≤val≤100 ,树的各节点的值各不相同递归版function preorderTraversal( root ) { // write code here const res = []; function cd(root){ if(root ==
2022-04-17 19:25:14 610
原创 BM22 比较版本号 js 数组转字符串
描述牛客项目发布项目版本时会有版本号,比如1.02.11,2.14.4等等现在给你2个版本号version1和version2,请你比较他们的大小版本号是由修订号组成,修订号与修订号之间由一个"."连接。1个修订号可能有多位数字组成,修订号可能包含前导0,且是合法的。例如,1.02.11,0.1,0.2都是合法的版本号每个版本号至少包含1个修订号。修订号从左到右编号,下标从0开始,最左边的修订号下标为0,下一个修订号下标为1,以此类推。比较规则:一. 比较版本号时,请按从左到右的顺序依次比较它
2022-04-17 16:57:13 172
原创 BM21 旋转数组的最小数字 js【数组末尾查找】
描述有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。数据范围:1 \le n \le 100001≤n≤10000,数组中任意元素的值: 0 \le val \le 100000≤val≤10000要求:空间复杂度:O(1)O(1) ,时间复杂度:O(logn)O(logn)示例1输入:[3,4
2022-04-17 16:04:37 288
原创 js 归并排序
js归并排序思路: 将数组粒度拆到最小,相互对比;其中回调是用来判断升降序的function merge(left, right, cd){ const res = []; while(left.length && right.length){ let isAscendingOrder = typeof cd === 'function' && cd(left[0], right[0]); if (typeof cd !== 'function' || isA
2022-04-16 23:29:50 343
原创 BM19 寻找峰值
描述给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于2.假设 nums[-1] = nums[n] = -\infty−∞3.对于所有有效的 i 都有 nums[i] != nums[i + 1]4.你可以使用O(logN)的时间复杂度实现此问题吗?数据范围:1 \le nums.length \le 2\times 10^5 \1≤nums.length
2022-04-11 22:42:26 345
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人