数据结构算法题目(一):数组、链表、栈队列与二叉树
以下所有内容编排按照Carl开源的算法攻略进行,感谢博主悉心的内容挑选和顺序编排。编程语言为C++;
数组篇
1.
原地删除某个元素值
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地
修改输入数组。
元素的顺序可以改变。不需要考虑数组中超出新长度后面的元素。
快慢指针: 1234567891011121314class Solution {public: int removeElement(vector<int>& nums, int val) { int slow = 0; //慢指针 for(int fast=0; fast<nums.size(); fast++){ if(nums[fast]==val) continue; nums[slow] = nums[fast]; //不等才拷贝快指 ...
误删博客Nodejs文件与博客迁移方法
今天通过本地服务器端口预览网页页面,清理了系统垃圾,可能因此系统误删除了一些博客文件,报错如下:
2024.2更新方法
下面记录了第一次解决方法思路,今天清理了垃圾重现了故障,捋了一下思路实际上不需要做博客迁移,源文件夹就能完成修复。
在运行rm -rf
node_modules之前,备份footer文件!备份footer文件!
既然Git bash是无效的,那么直接使用powershell运行
1npx npm install --force
安装完成,故障解决。把备份的footer文件替换掉新的footer文件,当然如果有更多的node.js文件,都要备份。
既然有了几分钟能修好的方法,那就查看一下究竟是删除了哪些文件让环境失效了。
原来是电脑管家把Node.js缓存都当成是VsCode缓存了,下次不要勾选这个即可。
无效方法
根据建议输入命令没有效果,只显示了npm错误日志信息。怀疑npm缓存文件带来的:
删除博客根目录下node_modules文件夹、AppData-cache文件夹
考虑到当前npm为9.5版本 ...
阿里云盘Motrix插件报错18
最近因为显存不足不得已部署了一个云GPU平台,除了跑算法之余还可以白嫖服务器带宽,平台贴心地准备了百度云和阿里云接口方便文件传输。因为百度云上传文件大小限死了4G,主要用阿里云多。号称永不限速的阿里云也不老实了,下载了客户端无论移动网络还是校园网只有2M/s,虽说是比百度云良心然而下载大文件远远不够,不过平台有佬做了插件,在网页端也植入了部分客户端功能:
插件地址
结合Motrix可能会报18代码错误,进入仓库地址:https://github.com/agalwood/Motrix/wiki/Error#18查看,发现
#18 If aria2 could not create directory.
原来作者在代码中指定了D盘路径,但是本地刚好没有D盘,导致下载目录创建失败。
修复方法:
进入脚本编辑页,在951行左右位置将路径修改成本机存在的路径:
1dir: (obj.getItem("aria-dir") || "F:\/aliyundriveDownloads") + (folderName ? " ...
Linux系统扩容
给新装的硬盘分个区给Linux,发现网上的资料鱼龙混杂,很多都是基于虚拟机操作,再复杂的也有。可能简单的没人愿意写,那就我来记录一下。本方法经过验证适用于Windows和Linux物理机双系统在同一块硬盘分区、新硬盘划出新分区。原理不难,整个流程按照系统分区、新建分区格式化、挂载到Linux系统、设置永久挂载、设置文件权限进行,步骤简单,但涉及硬盘操作务必小心,一个数字盘符错误可能就要折腾半天甚至覆盖掉有用数据了。
Windows分出空块
如果是整个硬盘都给Linux使用,该步骤可跳过,直接以硬盘未分配状态进入Linux系统操作即可。如果已经在Windows分配了空间,可以win+r唤出任务窗口输入diskmgmt.msc进入磁盘管理,进行压缩卷的操作。Windows的存储管理是基于盘的,压缩卷的作用是,将原有的数据集中到一侧,把盘一部分的存储空间数据清理出来。盘的已用空间越大,压缩卷的风险越大,因此应该做好重要资料备份。为了更好压缩,压缩卷前可删除所有系统还原点,关闭对应盘的系统保护,选择压缩卷,输入压缩空间。压缩成功即可得到多出来一块“未分配区域”,随即进入Linux系统。
...
【MathType】公式快捷键and【Markdown】公式语法
MathType是一款强大的数学公式编辑器,能够内嵌入Word中,方便文献参考公式书写。本文主要整理了我常用到的mathtype编辑快捷键,容易与其弄混的markdown语法也进行了整理。
MathType公式快捷键
1.希腊字母
1ctrl+g+对应字母
为了方便摘录了参考链接中的对照表。
2.上下标
12上标 ctrl+h下标 ctrl+l
3.不等式
1234小于等于 ctrl+k+【,】大于等于 ctrl+k+【.】不等号 ctrl+k+【shift+=】恒等号 ctrl+k+【=】
4.分式根式
1234上下分式 ctrl+f斜杠分式 ctrl+/二次根式 ctrl+rN次根式 ctrl+t+【N】
5.求和连乘
12求和 ctrl+t+【s】连乘 ctrl+t+【p】
6.其余用法
12345叉乘 ctrl+k+【t】点乘 ctrl+shift+k+【.】文本加粗 ctrl+shift+B字母加上横线 ctrl+shift+【-】字母加上矢量箭头 ...
vim编辑器快速命令
记录了vi编辑器的各种常用命令,方便查询使用。
vi的三种工作模式
命令行模式
默认进入编辑器的模式,可以进行查看、复制、粘贴、其他快捷键等,如果从其他模式激活命令行模式则按以下Esc。
插入模式 对内容继续增删改等操作,按下i激活该模式。
底行模式
光标位于底部,以输入命令进行vi操作,命令行下输入冒号(:),即可激活。
简单命令
1. 保存
1:w
2. 退出
12:q #没有修改过:q! #修改过不想保存
3. 保存并退出
12:wq #二者等效:x
高效的命令
1.
插入命令(从命令行模式进入插入模式)
123456789#小写组i #在当前光标插入内容,实际上是从光标前面一位开始插入a #在当前光标后面追加内容,即会从当前位置后一位追加o #在当前光标的下一行开始插入,即会自动空出一行#大写组I #在光标行字符首部进行插入A #与I相反,会去到光标行尾部进行插入O #在当前光标的上一行开始插入,也会自动空出一行
2. 运行Linux的原生命令
有时候我们在vi编辑器中,如果想运行linux命令,一般需要多开一个终端或者保存 ...
高等数学的奇技淫巧
Common Sense
绝对值不等式
画图理解 画图理解
有理多项式
1. 方程的解
奇数次多项式必然有奇数个零点,至少有1个零点(无穷异号、零点定理)。
若有偶数个零点,多项式必然可以拆出偶数+奇数项,奇数项本身会带零点,因此,零点只能为奇数个。
2. 提取公因式
如:
三角函数
特别的,假如在[0,]积分令t=,上下限都是0无法得到结果,因此必须经过上述恒等变换来解决。
函数 极限 连续
无穷小性质:
1 有限个无穷小的和仍是无穷小。
2 有限个无穷小的积仍是无穷小。
3 无穷小量和有界变量的积仍是无穷小。
无穷大量性质
1 两个无穷大量的积仍为无穷大量。
2 无穷大量与有界变量之和仍为无穷大量。
3 无穷大量和非零常数的积仍为无穷大量。
注: 1 有限个无穷大量之和不一定为无穷大量。
2 无穷大量与有界变量之积不一定为无穷大量。 如 均不是无穷大。
函数放缩: 为多项之和,各项取绝对值再求和
一元函数微分学
可积充分条 ...
连续|导数|中值定理
六十多岁的老专家还在钻研函数性质折磨考生,二十多岁的小伙子怎么能对这些看似简单的知识嗤之以鼻呢。学习是快乐的,开始吧。
函数连续性
直接给出定义:若函数f(x)满足 称函数在是连续的。
另一种形式:满足 称函数在是连续的。两种定义是等价的。
函数的导数
定义: 为函数在处的一阶导数。
同样的有另一种形式: 称函数在是连续的。两种定义同样是等价的。前者适合用于计算函数的一阶导数,后者适合用于折腾,因为可以相应地替换成满足一定条件的无穷小量,首先要满足当然是保证无穷小量能同时从和趋于0,才能作为导数的定义。
函数性质
函数、导数都是数学定量化的模型,或者称手段,目的只是为了研究函数本身的性质(单调性、凹凸性)以及由性质延伸出来特殊的点位(极值点、拐点)。这些点在不同的学科中都有着重要的研究意义,例如物理中速度、加速度,信号分析中信号变化的速率、考虑一个计算模型的收敛速度等。
单调性判别准则
单调性的判别:f(x)满足闭区间连续、开区间可导则:
1. 在开区间内满足
0,而且等号仅在有限个点上成立,则函数在闭区间上单调增加。
2. 在开区间内满足
0,而且 ...
数据结构与算法(三):查找与排序算法
此前的两篇文章介绍了线性表、树、图的基本思想以及相关算法,不难发现有若干算法是需要在有序的前提下实现的,查找和排序在数据结构中常常被当成预处理使用,而反过来,有的数据结构可以载入杂乱的数据供给查找和排序,故二者是相辅相成,相互依赖的,这就是为什么会在数据结构的末章总会提到查找和排序算法的原因,本文记录了相关常用的算法,旧金山大学网站中给出了相关算法的可视化交换页面,非常方便理解和算法验证。
查找
相关术语
查找:在数据集合中寻找某种符合条件数据元素的过程;
查找表:用于查找操作的数据集合,通常用于统称一种数据结构,不是什么新的数据结构。
关键字:可以唯一区别数据对象的数据元素,关键字查找结果必须是唯一的。
静态查找表:只需要对元素进行查找,性能只考虑查找速度即可。
动态查找表:需要对查找表进行元素查找、插入、删除等,性能除了关注查找速度,还要考虑插入删除的复杂度。
查找算法的评价指标
平均查找长度(Average Search
Length,ASL):表示查找过程中进行关键字比较次数的平均值,通常对同一个算法要同时考虑查找成功的ASL和查找失败的ASL。
时间复杂 ...
数据结构与算法(二):二叉树与图
递归问题
递归和迭代是程序设计中的两种基本思想,从数列的思想中可以进行理解:迭代就是给出某个数列的位置(如第i个),就需要使用通项公式来进行计算;而递归则不关心这个通项公式是什么,它只关心邻近项(前一项、前两项......)进行计算,虽然对人脑而言,从第一项去推断成百上千的计算量是很大的,但是用于是固定形式的计算,这种方式对计算机却很友好,尽管有时候会导致不必要的计算,但是这种思想下的代码却显得十分简洁易写。
另一方面,迭代是一种for循环的思想,它需要用户知道需要迭代多少次,什么时候进行停止和计算,就像数组的查找一样。而递归类似while循环思想,给定退出的条件,我们并不关心它究竟执行了多少次,只要退出时是我们需要的结果,递归就算成功,就像链表索引,无论链表多长,我们总可以通过指针去索引后面的值直到最后一位。但是在树和图中,数据元素之间不再具有线性表这种一对一关系,使用迭代对程序员的思维而言过于庞大,因此大量的递归将在这两种数据结构中体现。
汉诺塔问题
汉诺塔是经典的递归问题:A柱子中有64个圆盘,分别有64个大小,现在需要把A柱子中的所有圆盘移动到C柱子,移动过程每根柱子必 ...