- 博客(34)
- 收藏
- 关注
原创 3.无重复字符的最长子串
2、哈希表:只要需要判断数据是否重复出现,就用哈希表。注意哈希表里存的数只有一个,count返回值要么0,要么1。一个容易错误的点:不要访问到字符串size+1,这个地址也可以取到值的……1、滑动窗口:左窗口每个大循环+1,右窗口每次内循环拉满(直到触发条件)。一些细节:哈希表每次erase的时候,注意是erase前一次循环的左窗口。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。,所以其长度为 3。,所以其长度为 1。,所以其长度为 3。
2024-08-05 16:34:42
136
原创 extern和extern C
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会(C语言不支持函数重载),因此会造成链接时无法找到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。最常见的用法,当链接器在一个全局变量声明前看到extern关键字,它会尝试在其他文件中寻找这个变量的定义。变量的声明:向程序表名变量的类型和名字,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。
2024-08-05 16:02:26
158
原创 STL汇总
2、关联容器:存储键值对,每个元素都有一个键(key)和一个值(value),并且通过键来组织元素。3、无序容器(C++11 引入):哈希表,支持快速的查找、插入和删除。1、序列容器:存储元素的序列,允许双向遍历。
2024-08-05 12:04:22
149
原创 102.二叉树的层序遍历
例子中有三层,每层存储1 2 2个指针。那总体需要三层循环,每层循环内,分别pop1 2 2 次。(即逐层地,从左到右访问所有节点)。用queue来保存节点指针。
2024-08-05 11:57:48
290
原创 二叉树的前、中、后续、层级遍历
由这样的性质我们可以发现,二叉搜索树的中序遍历是一个单调递增的有序序列。如果我们反序地中序遍历该二叉搜索树,即可得到一个单调递减的有序序列。若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;中序在排序中经常用到,中序结果为递增队列,逆中序为递减队列。它的左、右子树也分别为二叉搜索树。深度遍历:前序、中序以及后序。
2024-08-05 10:25:42
175
原创 206.反转链表
2、中间:指针head指向头,指针p指向中间节点,指针t指向p的next,让p的next指向head,然后head、p往后挪一位;直到p的next为空,这时候t和p都在节点最后一位;1、头:指针p指向头,next指向nullptr;解析:头尾节点需要单独处理;,请你反转链表,并返回反转后的链表。3、让p的next指向head。
2024-08-03 15:51:38
191
原创 21.合并两个有序链表
1、确定返回队列:比较俩队列AB的头,小于等于的作为返回队列R的头;并让小的那个头指针指向下一个节点。2、比较队列的值,小的节点作为返回队列R的下一个节点;当前队列A/B指向下一个节点;3、当一个队列节点遍历完之后,另一个队列的剩余元素都拼接到返回队列R的尾巴上。新链表是通过拼接给定的两个链表的所有节点组成的。4、需要在开头判断是否传入了空队列,返回另一个。将两个升序链表合并为一个新的。
2024-08-03 15:36:23
198
原创 141.环形链表
指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。解析:哈希表保存指向链表节点的指针,如果在哈希表里查到了当前指针,则为环形链表。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。仅仅是为了标识链表的实际情况。用unordered_set。,判断链表中是否有环。给你一个链表的头节点。
2024-08-03 15:19:29
255
原创 深拷贝、浅拷贝
值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。存在的问题:如果定义了指针类型,但是没有自定义深拷贝函数,当用已有对象初始化另一个对象(调用浅拷贝函数)时,后一个对象的指针仅仅是指向了前一个对象指针指向的内存空间,当函数结束调用析构函数时,两个对象都会释放一次指针,导致内存泄漏。拷贝构造函数:用类的一个对象(的值)去构造另一个对象,后一个对象是不存在的,在拷贝构造的途中创建。引用是类型安全的,指针不是。
2024-08-01 11:10:57
339
原创 static_cast与dynamic_cast
static_cast是c语言的强制转换代替品;dynamic_cast会运行时检查该转换是否类型安全,只在多态类型时合法,即该类至少具有一个虚拟方法。static_cast在编译时期强制转换,dynamic_cast在运行时期转换(较安全)。
2024-07-31 20:30:50
223
原创 C++11新特性
nullptr是c++11引入的空指针常量值,NULL其实是个int型的值0,在重载函数中容易因为二义性编译失败。override:修饰派生类的函数,表明函数是基类函数的重写。此函数必须在父类中存在虚函数。3、std::function & std::bind & lambda表达式。final:禁止当前类进一步派生,类中的虚函数禁止进一步重载。1、auto和decltype。
2024-07-31 20:27:45
133
原创 23.合并K个升序链表【HARD】
请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。将它们合并到一个有序链表中得到。
2024-07-31 19:40:53
174
原创 160.相交链表
请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。,函数返回结果后,链表必须。
2024-07-31 16:42:44
1698
原创 2.两数相加
注意此题不能用链表转化数字,相加,转化链表做,链表很长,数字存不下。所以是用补齐链表、对应位置相加、记录进位,模拟加法计算去做。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。的方式存储的,并且每个节点只能存储。难点:最后的一位没有加上。
2024-07-31 14:19:47
340
原创 C++ STL: unordered_set
unordered_set存储原理是声明一个有n个桶的数据结构,计算加入到unordered_set的新的值hash,然后计算hash%n后的值x,将新的值加入到桶x中。当桶x中已经有了元素,就直接链接在后边。使用hash散列的方式存储数据,是一种使用hash值作为key的容器。构造:unordered_set set;
2024-07-30 20:49:24
244
原创 142.环形链表②
解答:用哈希表存指针,每次指向下一个节点时,查当前哈希表里是否存在此指针,存在则返回。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。返回索引为 1 的链表节点。返回索引为 0 的链表节点。给定一个链表的头节点。如果链表无环,则返回。,则在该链表中没有环。
2024-07-30 20:43:38
155
原创 C++ STL priority_queue
priority_queue是一个C++实现的堆/优先队列,默认为最大堆。插入时间复杂度o(nlogn)。头文件:#include
2024-07-30 13:54:48
237
原创 堆(Heap)
堆分为最大堆和最小堆,通常用完全二叉树来实现,完全二叉树可以用数组来实现,所以堆经常用数组存储,非二叉树链表。由于堆的这种特性,可以快速访问,所以常用来实现优先队列。以数组存储堆后,父子节点的位置可以通过简单运算获得。
2024-07-30 13:37:30
181
原创 75.颜色分类
对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。必须在不使用库内置的 sort 函数的情况下解决这个问题。给定一个包含红色、白色和蓝色、共。分别表示红色、白色和蓝色。
2024-07-30 12:03:15
168
原创 148. 排序链表
1、递归二分列表:用p->next->next做判断,p每次循环往后挪两位,q每次循环往后挪一位,这样循环到结尾时,q正好指向中位前一位。从此处截断队列,前后分别再次进入二分循环。冒泡排序:o(n^2),会超时。归并排序: o(nlogn)
2024-07-29 20:39:09
407
原创 56. 合并区间
解题思路:1、先排序,按数组[0]进行升序排列;2、检查前一个数组[1]和后一个数组[0]的大小,确定是合并两个数组,还是直接插入后一个数据。区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。熟悉了一下排序算法(冒泡)。
2024-07-29 12:03:12
323
原创 qperf 网络检查工具
某项目搭集群后,数据子节点向工作节点发送请求时,经常timeout,导致一些分钟内能完成的任务因为timeout重试,干到半个多小时,上游任务因超时宣告失败。这个问题从去年一直到现在,提出过两三次了,都说解决了,但是最后还是会报。为了告诉那群**,确实是网络问题,经师兄介绍,我搞了这个工具测测。安装CentOS Linux系统: yum install qperf安装。使用一个节点运行 qperf 作为服务端,另一个节点则运行 qperf 作为客户端,与服务端建立连接之后打流,获取带宽和延迟等数
2021-04-06 10:32:03
1624
原创 重构代码——从一个例子开始
一个例子##这个例子不好的地方1、输出格式唯一,如果修改需要单独修改输出格式其实这个问题不是问题,在需求没有更改的情况下。但是需求是一步一步提升的,如果每次提升需求都要重写某部分代码,那耗费的精力就比较大了。2、理解很困难= =问题在哪里呢?因为例子没有说具体的计费方式,在代码中写死了计费&折扣方式,如果以后需要修改折扣方式,比较难统一。比如对悲剧的计费要修改,积分也要修改,那代码中就需要修改两处地方;比如要添加正剧这个类别,需要将计费、积分等重新捋一遍。3、没有拆分,所以不清晰,其实就
2020-12-12 18:16:37
176
1
原创 进程和线程一些问题
基本概念进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一些问题1、为什么线程挂掉进程就一定会挂掉呢?浏览了不少博客和解答,收集到两个重要的信息。首先是一份代码验证:线程崩溃是否会造成进程崩溃?
2020-12-03 15:35:08
354
原创 paxos理论
1.maxVote定义多轮投票是无序的,从多轮投票里找那些超过半数投票的提议,其中,比当前提议编号小的那些提议中,选取最大编号的提议。比如:Bbal=2的提议,没有比他编号更小的提议了,因此MaxVote=null;Bbal=3的提议,比他小的提议编号有2,而且Bbal=2的提议的投票数>一半,因此MaxVote=编号为2的提议;Bbal=5的提议,比他小的提议编号有2、3,但Bbal=3的提议的投票数<一半,因此MaxVote依然是编号为2的提议;Bbal=9的提议,比
2020-07-08 19:46:56
256
1
原创 原子操作
可以保证x先写入内存,对全局可见后,才读取x。lwsync:双向barrier,前面的指令必须在lwsync前执行完,后面的指令不会优于lwsync执行。acquire和release:单向barrier,lwsync代价太大,拦得太多。在这里只需要ready=1在write x后即可,如果有其他指令,完全可以在临界区内;判断ready==1在read x之前即可,其他的操作可以在临界区内。...
2020-07-08 19:45:59
449
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人