![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++刷题
慕梅^
模棱角,退优越,沉下心,听进话,忌清高,冷旁观。
展开
-
[考前速记] 最大公约数与最大公倍数
值得注意的是:让a和b均为非负数,可以使用algorithm下的abs(int x)和cmath下的fabs(double x);但由于a*b可能溢出,因此可以修改为。原创 2023-09-19 22:03:58 · 188 阅读 · 0 评论 -
判断满二叉树、完全二叉树
(int)(pow(2,step))需要加上int转换。如果出现空树,就不能再出现非空树。原创 2023-09-16 19:52:27 · 192 阅读 · 0 评论 -
翻转二叉树、还原二叉树、最近公共祖先
以先序中序还原二叉树为例,先序的第一个元素为该树的根结点,通过该根结点的编号,便可以将中序和先序的元素划分左右子树。左右子树的根结点就是该树的左右结点,同时该树的根结点又有可能是其父亲结点的左右孩子。层序中序还原二叉树:思路一样,层序序列无法像前面两个可以简单地分开左右子树的元素,因而需要重新筛检左右子树的元素,重新使用vector进行组合,按照层序序列的顺序筛完,第一个元素总是该树的根结点。现在返回的值要么是-1(表示未寻找到p和q)和截止至root这个位置的最近公共祖先的结点的数值。原创 2023-09-16 19:06:25 · 189 阅读 · 0 评论 -
静态链表处理
在C++中,可以使用数组来创建静态列表,其中每个元素都有固定的位置和索引。可以通过下标寻址的方式来访问和操作列表中的元素。我们可以将下标0作为头节点,作为第一个节点的前驱。我们依然使用0作为头节点,设置两个游标,一前一后。静态链表是指使用数组来表示节点。这里给定了链表的第一个节点的下标。双向链表:(回文链表)原创 2023-09-10 19:19:58 · 174 阅读 · 0 评论 -
[BFS] 广度优先搜索
题目的思路很简单,首先就是从头到尾遍历数组,当遇到1并且未如过队(证明其是一个全新的块)时进行BFS,直到周围都是0无法进展为止,在BFS过程中,遍历过的1都被压入队中,因此inqueue为1,那么经过几次BFS,证明就有几个块。// 在小循环结束后,意味着整层的元素都被遍历过了,若没有,则下一层。// 注意每次压队的时候都要将inque[x] = 1,表明入队过。// 获得这一层的所有元素 ,因为咱们是广度优先。// 将初始的元素压入队列。//大循环 队列q不为空。// 判断是否可以入队的条件。原创 2023-09-08 17:27:14 · 180 阅读 · 0 评论 -
木棒切割问题
若我们debug会发现其可能会一致卡在left = mid,例如(0,1),那么就会一直循环。原创 2023-09-05 14:46:56 · 145 阅读 · 0 评论 -
[二分查找] 旋转数组
mid将旋转数组分为两块区间,但第一块区间的值的条件并不是简单的x原创 2023-09-03 18:08:01 · 738 阅读 · 0 评论 -
常见 二分查找
3.若x < A[mid] 范围在[left,mid],这个得注意,可以举个例子[3,5,8]x = 4,A[mid] = 5,既然A[mid]大于x,那么它就可能成为第一个大于等于x元素的数。这里可以将数组a[n]的输入为[0,n],那么当x大于数组的所有元素[0~n-1],那么就输出n,表示没有该元素。1.若x == A[mid] 那么第一个大于等于x的元素的范围肯定在[left,mid],既然A[mid]等于x,那么他就可能成为第一个大于等于x元素的数。循环的条件为left原创 2023-08-27 14:07:41 · 154 阅读 · 0 评论 -
[递归] 子集 全排列和组合问题
和全排列很像,不过全排列是有顺序的(样例中3 4 和4 3在全排列均是有效的),而组合是无序的,因此我们在挑选的时候可以人为地进行有序限制,从而不会重复。如果按照之前的思路,那么样例1会出现大量重复,与子集的解决方法类似,不过是这里是记录每个数的个数,使用cnt[]进行计算,并且每个数只记录一次;如果不该与,之前的序列都是没有重复的元素,因此可以下一次的序号需要+1以保证大于前面的数,然而这里有重复的元素,因此从m开始。那么只需要用一个数组存储这些元素,在压栈/出栈时,换成对应的数组元素即可,思路一致。原创 2023-08-31 18:12:12 · 175 阅读 · 0 评论 -
[递归] 自然数分解之最大积
同样的思路,只是解决的问题不一样。原创 2023-08-30 16:44:53 · 116 阅读 · 0 评论 -
[递归] 自然数分解之方案数
例如7,我们假设其前一个数为0,带入递归函数func(0,7) pre = 0,now =7 表示现在要拆分的数为7。递归的边界就是,当我们需要拆分的数为1时,表示无法拆分,而由于其本身已经在上一次的temp++加过了,因此返回0。如果符合那么我们就可以累加,值得注意的是,我们1-6本身也是一个拆分的组合,因此temp++总的来说func(pre,now)表示拆分的个数,本身这个组合通过temp++进行计算。因为我们 拆分的是now = 7,那么拆分出来的第一个数要大于等于pre = 0。原创 2023-08-30 11:10:54 · 347 阅读 · 0 评论 -
数组 刷题常用
类型的,可能会导致不正确的结果。在char a[][]二维数组上,这样赋值也是没问题的memset(a,'-',sizeof a);memset函数,头文件为cstring,int a[][]格式为memset(a,value,sizeof a);但是建议只赋值0和-1,因为memset采用的是字节赋值。首先便是二维数组的下标,不要将与坐标轴的坐标弄混就行。对数组中的元素进行赋值,使用memset或者fill。a[i][j] 就简单记为第i行第j列的元素。时,虽然语法上没有问题,但如果。原创 2023-08-30 10:58:40 · 78 阅读 · 0 评论 -
string 常见用法
erase(first,last)first为需要删除的区间的起始迭代器,last为需要删除末尾迭代器的下一个地址。str.replace(it1,it2,str2)把迭代器[it1,it2)位置替换为str2。(5)substr(pos,len)返回从pos号位开始,长度位len的子串。str.find(str2,pos)从str的pos号位开始匹配str2。当str2是str的子串时,返回其在str中第一次出现的位置。原创 2023-08-29 09:38:39 · 89 阅读 · 0 评论 -
map 常见复习
erase(first,last)first为起始迭代器,而last为末尾迭代器的下一个地址。可以通过迭代器it同时访问键和值,it->first,it->second。erase()有两种方法:删除单个元素或者删除一个区间内的所有元素。·mp.erase(it)其中it为需要删除的元素的迭代器。(1)通过下标访问,例如map mp。(1)find(key):返回键为key的映射的迭代器。·mp.erase(key)key为预删除的映射的键。删除一个区间内的所有元素。原创 2023-08-28 20:11:03 · 50 阅读 · 0 评论 -
简单 搜索问题
对于容器,只有vector、deque、string是可以使用sort的,这是因为像set、map这种容器是使用红黑树实现的,元素本身有序,故不允许使用sort排序。bool cmp(int a,int b){//由于vector里的元素是int类型。return a>b;//这个就是规则,整个str就会按照递减排序。sort(首元素地址,尾元素地址的下一个地址,比较函数(非必填))若不写比较函数,则默认对前面给出的区间进行递增排序。return a原创 2023-08-28 09:39:03 · 70 阅读 · 0 评论 -
常见 进制转换
总体来说,我们只能获得个位,因此围绕着个位进行求解。原创 2023-08-27 14:41:58 · 33 阅读 · 0 评论 -
常见日期处理
【代码】日期处理。原创 2023-08-27 11:14:58 · 32 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。原创 2023-08-18 20:49:01 · 132 阅读 · 0 评论 -
24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。还是要虚拟一个头节点比较好做,指向原始节点,这样就是以3个节点为一个单元进行操作。原创 2023-08-18 20:36:07 · 94 阅读 · 0 评论 -
[leetcode] 707 设计链表
/ 链表变为 1->2->3。// 现在,链表变为 1->3。以指示链表中的上一个节点。假设链表中的所有节点下标从。你可以选择使用单链表或者双链表,设计并实现自己的链表。是指向下一个节点的指针/引用。如果是双向链表,则还需要属性。原创 2023-08-18 19:32:24 · 496 阅读 · 0 评论 -
c++ 成绩统计
编写程序删除数据中的无效记录和每个选手的多余记录,每个选手只保留有效成绩中成绩最高的一条记录,然后返回成绩排名第。数据中每一行是一条记录,每条记录包含两个整数,第。有一个二维表格数据,它的值全部是整数,其中存储了若干个选手参与。的选手编号(当成绩相同时编号小的选手在前),如果不足。个整数是汉字输入比赛成绩,应该是一个小于等于。输入的二维表格数据中的数据一定全部是整数,二维表格数据中每一行一定是两个整数。要求删除数据后,至少有一条记录。个整数为选手编号,它应该是一个。输出选手的编号一定是一个。原创 2023-08-17 21:11:11 · 528 阅读 · 0 评论 -
vector用法速览
erase(first, last)即删除[first, last)内的所有元素:vi.erase(vi.begin() + 2, vi.begin() + 4);insert(it, x)用来向vector的任意一个迭代器it处插入一个元素x,也就是在it位置之前插入,时间复杂度为O(N)。erase(it)即为删除迭代器为it处的元素:vi.erase(vi.begin() + 2);clear()用于清空vector中所有的元素,时间复杂度为O(N):vi.clear();时间复杂度均为O(N)。原创 2023-08-17 19:34:06 · 352 阅读 · 0 评论 -
变形回文串
因此翻转一个字符串str: reverse(str.begin(),str.end())函数时,你需要传递一个范围,它将会翻转这个范围内的元素。在C++中,字符串()是一个由字符组成的序列,可以通过使用迭代器来表示。将这个字符转换为其对应的ASCII码值的字符串。的由大小写字母和数字字符组成的字符串。进制数字连接组成的字符串是否是回文串。返回字符串的第一个字符的迭代器,而。返回字符串末尾的下一个位置的迭代器。中每个字符只包含数字、大小写字母。”,显然是一个回文串,那么输出。,那么连接成的字符串为“原创 2023-08-17 17:43:24 · 92 阅读 · 0 评论