自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c++11新内容补充

lambda和范围for很像,他们实际上都是封装出来的,lambda底层就是一个仿函数的类实际上就是生产在仿函数中的成员变量operator()中的传参operator()的返回值operator()的函数体。

2025-04-10 23:24:03 663

原创 算法题(122):铺地毯

因为本题只需要我们求出最上层的地毯编号,我们从后面开始判断只需要找成功一次就可以退出循环了,而如果我们从头开始枚举则必定需要将完整的循环进行下去,效率太低。若我们的x,y分别满足大于左下角坐标的x,y就可以确保该点位于地毯的左下角的右上方。若我们的x,y分别满足大于右上角坐标的x,y就可以确保该点位于地毯的右上角的左下方。本题需要我们找出覆盖在目标点上的最上层地毯,并将地毯编号打印出来(编号从1开始)本题枚举对象为地毯,顺序为逆序,方式为普通枚举。如果最后枚举失败,就打印-1。从而确保该点被地毯覆盖住。

2025-04-10 16:18:08 83

原创 算法题(121):高精度除法

若除数小于等于当前被除数则可以将运算结果加到output中,否则就在下一次循环将当前被除数乘10,并加上下一个索引位置的被除数。特殊处理:如果最后什么数据都没有插入output,意味着运算结果为0,我们在输出的时候就要将这种output为空的情况输出为0。本题需要我们模拟除法的过程,将超过整形数据范围的被除数和长整型的除数除法结果运算并打印出来。当output中已经有了数据的时候,如果我们的除数大于被除数,此时就要插入0字符。我们在进行除法运算的时候,需要先判断除数与当前的被除数之间的大小关系。

2025-04-09 09:11:11 89

原创 算法题(120):高精度乘法

2.由于我们的乘法需要区分两个乘数谁的size更大,谁的size更小,所以我们在进入运算之前需要通过判断将较大的size的string放在第一个参数位置,较小的size放在第二个参数位置。我们发现两个索引位置的数进行运算,最后得出的数据所处的索引值是他们索引值之和。3.c数组的作用是存储运算值,不过存储的时候他的结果是索引0位置为个位,而我们的结果是索引0位置为最高位,所以我们需要逆序输出数据。只进行一次进位的乘法只有在最后一次错位相加的运算的时候进行进位,前面的运算都只会直接相加,不进行进位运算。

2025-04-08 15:15:34 378

原创 算法题(119):高精度减法

判断大小并确认进入减法模拟的参数顺序,将大的数放在前面传参,小的数放在后面传参。并且用judge记录数的最终正负号,若是正数就是false,负数就是true。若结果为负数就需要借位,将minus置为-1,不为负数就不用借位,将minus置为0。将借位数minus,s1字符串对应位和s2字符串对应位进行计算。先从数的位数进行判断,然后再从高到低的位数进行判断。本题高精度减法主要是要区分正负号,然后进行模拟。如果结果为0需要特殊处理,否则会输出很多个0。根据judge的状态对output进行输出。

2025-04-07 23:10:08 193

原创 算法题(118):高精度加法

由于本题的数据量级很大,运算起来会超过任意一种整形的承载上限,所以我们利用字符串实现高精度加法。2.多情况融合的时候我们可以分开控制逻辑,比如s1和s2的逻辑我们就分开两个if语句进行判断。3.这里我们从字符串的后面开始运算是因为哟啊模拟从个位开始运算的逻辑。addstring函数的作用是将计算结果给到output字符串。1.进行运算的前提就是两个数中任意一个还有数据,或者还有进位。本题需要我们模拟加法的运算逻辑对大数进行加法运算。

2025-04-06 14:31:40 281

原创 算法题(117):字符串的展开

一般来说题目字数和要求很多的题就是模拟题,模拟题特别需要注意的就是细节,在编写代码之前一定要把细节想清楚,否则很容易出错。首先,题目给了我们一个字符串,这个字符串中的某些部分是需要扩展的,有些部分是不用扩展的,在这里我们就分成这。2.判断越界不要使用i-1,因为i是size_t类型,-1后会变成很大的正数,导致逻辑错乱。3.对于输出类型部分:p1为1和3对于数字的字母都是一样的,而p1为2就需要分开处理。对于'-'两边的字符属于顺序递增的情况,我们就直接越过'-'接入output。

2025-04-05 20:43:54 427

原创 算法题(116):蛇形方阵

方阵输出中,由于每个数据都要占三个字符,不足的用空格补齐,所以我们就分个位数,十位数,百位数三个位来输出。先插入数据,然后判断出下一步要插入的数据索引坐标并更新到row和col中。本题需要我们打印出蛇形递增1的方阵,每个位置占位都为3,不足的补空格。按照右下左上的方式循环进行数据插入,然后在越界访问时进行方向转换即可。方向转换需要用(pos+1)%4,要取余是因为方向是循环进行的。个位数:两个空格,十位数:一个空格,百位数:不用空格。循环n*n次,然后i就是需要插入数组的数据值。

2025-04-04 13:45:28 161

原创 算法题(115):多项式输出

本题需要我们根据题目给出的次数n以及各项的系数把多项式输出出来。下面我通过三个层面解析一个可以输出的多项式的子部分的组成的要求。经过阅读可知,和我们学过的数学上的多项式格式是一样的。

2025-04-03 16:04:23 184

原创 算法题(114):矩阵距离

本题有多个起源点,也就是1,我们可以把他们都加入到队列中,然后按照正常的bfs流程走。1.用char二维数组记录是因为题目中给的是不带空格的输入,用int会被识别为一个数字。2.核心就是对没遍历过的位置进行距离更新,因为bfs的性质,最先搜索到的就是最短距离。求法1:公式法,带入题目公式,利用|x1-x2|+|y1-y2|求出。若用单源的bfs走就是遍历每个0去搜索,不过会超时。本题需要我们找出所有0距离最近的1的曼哈顿距离。而当前位置最短距离就是前一个位置的最短距离+1。求法2:曼哈顿距离就是最短距离。

2025-04-03 00:28:40 388

原创 c++:封装哈希表实现unordered_map与unordered_set

这里我们修改了构造函数的参数,将HT*变为const属性,这是因为后续支持cosnt_iterator的时候会传递的对象是const属性,如果这里参数不是const属性会导致权限被放大。这里我们传给哈希表的参数不再是key和value,而是单独的k和容器存储的数据类型(set中是key,map中是pair<K,V>),这样可以兼容set和map进哈希表。首先我们要在unordered_set中写一个SetOfT,返回值类型为K,不过需要注意的是返回的是const类型的,否则会导致权限放大。

2025-04-02 23:00:16 1257

原创 算法题(113):八数码难题

首先我们分析搜索方法:我们需要找到矩阵的字符0位置,然后对它进行上下左右四个方向的交换移动,移动完之后将新的矩阵放入queue中。2.正规的bfs写法都是用pair类型去维护待查找对象和其最短路的,这里我们的当前最短路就是用前一个状态的最短路+1。1.queue用于记录等待进行交换的新的矩阵,之所以不用queue存储0的坐标是因为0很容易搜索出来。1.为了防止把字符s给改变,我们需要先用s1去得到s的值,改变临时变量s1.本题需要我们找出将3*3矩阵从初始矩阵变为目标矩阵所需要的最短步数。

2025-04-01 23:29:39 442

原创 c++:哈希表

哈希表又叫散列表,他是非顺序存储,存储的位置被交换并没有影响,将key和存储位置通过哈希函数进行映射,包含无序set和无序map。他的查找主要依靠哈希函数计算出key所处的位置,从而实现常数级别的查找。

2025-04-01 19:57:29 1002

原创 算法题(112):catch the cow

由于本题普通的贪心策略是不行的,所以我们就不考虑贪心,而是暴力搜索所有情况,不过在搜索过程中,我们如果遇到了完全相同的数据就需要查看备忘录,以减少搜索次数。最关键的是对2*x的理解,他是动态的这个x表示的就是当前位置的值,而不是一开始录入的最开始的位置的值x。由于备忘录是全局变量,且我们有多组数据需要判断,所以要重新初始化防止上一组的数据残留影响当前组的判断。bfs的时间复杂度是O(N),而本题的搜索次数最多为1e5,所以时间复杂度是允许的。因为我们是一步步进行遍历的,所以最先搜索到y的就是最短距离。

2025-03-30 20:42:16 263

原创 算法题(111):k与迷宫

由于不可以原路返回,所以创建一个距离数组去记录到该位置走的步数,而若没走也可以看出来,并创建一个distance去给值给到距离数组(每进入更深一层就++)我们本题采用bfs算法,在最坏的情况下我们需要遍历所有位置,时间复杂度为nm,而进入队列的最多也是nm,所以总体时间复杂度为nm。若为出口:更新距离数组,并维护mindistance(因为输出需要距离出口的最短距离),并让出口数++本题需要我们寻找迷宫中的所有出口,若有出口需要输出距离最近的出口的距离,若没有就输出-1。

2025-03-29 21:51:59 307

原创 算法题(110):马的遍历

q.size一开始表示的是当前一批需要走的马的个数,如果不提前记录,后面下一批的马个数也会算入size中,导致循环逻辑出错。不过本题的马的具体走法还需要观察题目的走法,他的移动不是1,2的移动,而是3,2的移动。由于本题是bfs算法,而该算法有一个核心就是队列,我们的队列存储数据类型在本题中就是pair<int,int>因为存储的等待走一步的马的坐标。1.由于本题给的坐标x,y是从1开始的,而我们的数组索引都是从0开始的,所以这里把x,y都减一,从而和我们建立的数组索引统一。

2025-03-28 23:10:35 346

原创 算法题(109):滑雪

首先我们要在主函数中用双层for循环遍历每个位置,做到从所有起点开始dfs搜索,然后在dfs中,分别对其上下左右四个位置进行搜索,并最后把搜索完的最长路径返回给上一层。1.maxsize只能初始化为1,因为如果后面上下左右都没有合法落点,我们就只有当前(x,y)属于合法落点,此时我们就直接返回maxsize,所以他只能初始化为1。时间复杂度:本题的数据量在100内,可以支持n^3的时间复杂度,不过如果使用递归记忆化搜索剪枝也是可以的。本题需要我们找出区域中最长滑坡的长度。

2025-03-27 15:50:29 410

原创 算法题(108):天下第一

1.由于轮回中是先出现x,然后出现y,所以为了模拟轮次情况,先判断x再判断y。2.每次判断结果都要记录在备忘录中,以进行剪枝。本题需要我们判断多组x,y的值的比赛结果。

2025-03-26 23:11:53 184

原创 c++:封装红黑树实现map与set

我们前面实现的迭代器只能支持普通引用和普通地址返回,而不能控制他为const属性,且如果我们迭代器返回的指针或引用不再是普通的指针/引用,而是智能指针、右值引用时,也无法兼容。由于我们的map和set是红黑树为底层实现的,所以指针无法直接充当迭代器,我们还需要将迭代器单独封装进一个类,然后重载运算符实现迭代器除了访问外的功能。然后考虑右树为空的情况,在父节点存在的情况下寻找到子节点为父节点的左节点的那个父节点,并让迭代器中的_node指向该父节点。然后返回_node。然后进入while循环,

2025-03-26 20:40:44 1189

原创 算法题(107):function

经过分析我们可知:本题会出现完全重复的递归,所以我们需要使用备忘录对已经知道结果的递归结果记录,每次进入递归时要记得查找备忘录。1.之所以不用记录大于20的情况的递归结果,是因为他们的结果都是w(20,20,20),后面会记录到备忘录中。本题的数据范围虽然很大,但是由于条件2的限制,数据量可以看成是20,于是我们就可以使用递归函数了。本题需要我们根据题目写出递归函数,并返回递归结果。(2)dfs递归函数。

2025-03-26 00:01:42 281

原创 算法题(106):斐波那契数

f(2)出现了三次,f(3)出现了2次,如果我们在第一个搜索出f(2)或f(3)的时候记录下他们的值,那么就可以剪掉很多递归情况,从而提高效率,降低时间复杂度。而第n个斐波那契数等于第n-1个斐波那契数加第n-2个斐波那契数,所以我们的dfs函数搜索策略就是直接返回dfs(n-1)+dfs(n-2)即可。1.由于斐波那契数的数据都是大于0的,所以我们初始化为-1就可以满足初始化数据值与所有搜索值不等的要求。2.memset的使用方法是依次传递:初始化的地址p,初始化的值num,初始化的总字节数x。

2025-03-24 10:53:51 235

原创 算法题(105):小猫爬山

我们优先搜索不开新车的情况,所以把开新车情况放在for循环后,只有当所有旧的缆车都无法承载当前猫的体重时才会进入开新车的情况。之所以可以直接让c给到answer,是因为经过了剪枝最优化搜索的筛选,c一定是小于answer的,否则就被剪掉了。本题的数据量小于等于18,所以我们在做好剪枝的前提下可以使用深度优先搜索解题。本题需要我们找出将n个小猫放在有限重的缆车上运下山所需的最小缆车数。所以我们通过compare函数,自己实现大数据优先的降序sort。这里我们进行剪枝3的优化1:先从较重的猫开始放入。

2025-03-23 18:04:38 271

原创 算法题(104):数的划分

我们看到圆圈2的位置,当我们遍历到3开头时,根据剪枝1,我们只能往后面插入大于等于之前的数据的数字,而即使后面的数都是3也已经总和大于6了,所以以3开头是不可能满足条件,直接剪枝这种情况即可。其次确定剪枝位置,不能是for循环外面,因为在外面剪枝是属于进入了该情况才剪枝,而我们是要实现在进入剪枝情况之前就剪枝,所以要在进入dfs前进行判断。我们如果dfs进入了不满足剪枝2的情况后才进行判断会导致有额外的时间消耗,可能导致超时,所以我们要在进入不满足剪枝2的情况之前进行剪枝。

2025-03-22 18:52:21 157

原创 算法题(103):数独

(1)由于我们是一个个搜索,所以我们进入深层递归前需要进行判断,若列数没到9就可以进入行数不变,列数++的位置搜索,若列数超了,那就进入行数++,列数为1搜索。(2)本题之所以从0索引开始,是为了支持行数/3和列数/3的算法,因为从1索引开始的话,我们的第三行/第三列就无法归为0九宫格,而是3/3==1归为1九宫格了。matrix表示的就是3*3的九宫格,而我们利用行数/3以及列数/3的方法可以使九宫格内的数据都被归类到一块,然后即可表示该num在九宫格内的插入状态。本题需要我们找出数独的解,并打印出来。

2025-03-21 20:19:38 402

原创 算法题(102):八皇后

当每一行都插入了数据时,我们将count++,表示排列方式又多了一种,然后根据counts的值判断是否为前三个解,若是则输出path的数据。由于每行只能有一个棋子,所以我们可以一行一行的进行棋子排放,排放的时候注意当前位置是否满足列,主对角线,副对角线的规则。先判断行,列,主副对角线是否有棋子存在,若都没有则进行bool数组状态更新,以及path的插入,然后进入dfs搜索下一行。本题需要我们找出n*n的棋盘中,满足题目中所有位置规则的排列的总数,以及前三个排列方式的具体位置。

2025-03-20 18:36:01 288

原创 c++:红黑树

1.当uncle为红,变色2.当uncle不为红,变色+旋转(1)若parent为左孩子,cur也为左孩子:左旋+变色(2)若parent为右孩子,cur也为右孩子:右旋+变色(3)若parent为左孩子,cur为右孩子:左旋加右旋+变色(4)若parent为右孩子,cur为左孩子:右旋加左旋+变色。

2025-03-19 19:37:17 1632

原创 算法题(101):选数(dfs)

本题的数据量是20以内,而我们在25以内的算法时间复杂度最大可以是2^n。也就是树形递归的时间复杂度,所以本题可以使用dfs深度优先搜索。我们采用试除法:将num与2~根号num之间的整数相除,若都不能整除则为素数,否则不是素数。本题需要我们判断从n个数任取k个数的和为素数的个数。

2025-03-19 18:46:03 259

原创 算法题(100):腐烂的苹果

2.第一步是将当前批次的腐烂苹果数量记录下来,然后对这些苹果依次进行上下左右传播,若遇到新鲜苹果就改为腐烂苹果,新鲜苹果数量--,并将它的坐标加入腐烂队列中。首先我们分析腐烂过程,第一批腐烂苹果开始扩散,然后第二批腐烂苹果继续扩散,直到没有可以腐烂的苹果或者没有新鲜苹果为止。本题需要我们判断苹果是否可以完全腐烂,若可以完全腐烂,那么最短腐烂的所需时间是多少。1.我们进行腐烂模拟的前提条件是还有待腐烂传播的苹果以及还有新鲜苹果。我们需要利用队列存储当前批次腐烂的苹果以及下一批次腐烂的苹果。

2025-03-17 23:21:35 189

原创 算法题(99):孩子们的游戏(约瑟夫环)

(因为原编号方式的第一轮删除的点的下一个点就是下一次编号方式的0编号点,而我们在这里用k+1就相当于把新的0编号点转换成原编号方式的0编号点,我们在按原编号的0编号点加上x就得到y)我们首先顺着思考,在n个孩子的情况下,进行第一轮删除后,只剩下n-1个孩子,然后我们对删除的孩子的下一个孩子。但是n=1的时候,无论m为多少,结果都是n==1下编号为0的孩子最后一个删除。x为n-1编号方式的最后一个删除的节点的编号。最后一个删除的孩子的编号由n和m共同决定。y为n编号方式的最后一个删除节点的编号。

2025-03-16 23:25:06 249

原创 算法题(98):大数加法

1.由于我们是从个位开始计算,而字符串的存储size-1的位置才是个位的位置,我们就把j和i初始化为size-1.3.字符串的头插可以使用=和+号实现,我们只需要把需要插入在前面的数据转换成char类型然后+answer即可。2.当有进位或两个大数还有数据的时候,我们进行大数加法。

2025-03-15 21:44:43 216

原创 算法题(97):you

you一定要优先组合在一起,因为只有o是得分点,而you是得分转换率最高的,一个o可以得2分,若直接用oo来得分需要两个连一起得一分。如果大于1就是剩余个数减一(ooo第一第二个oo可以得一分,第二第三个oo可以得一分)本题需要我们根据给定的y,o,u三个字符的个数自由组合字符串,实现最高得分。我们可以先组合出最多的you字符串,然后根据o的个数判断1分的个数。在you三个字符数量均不为0的前提下进行you的提取。如果小于1则不足以组成oo得分,add为0。提取完后我们就判断o的剩余个数是否大于1。

2025-03-14 21:23:10 139

原创 c++:AVL树

3.父节点平衡因子为2/-2,说明节点失衡,进行旋转,然后不用向上更新。

2025-03-14 15:27:32 723

原创 算法题(96):杨辉三角

由于斐波那契数列的首尾元素都是1,所以我们可以在扩充数组大小的同时把所有元素初始化为1,然后后续对除了首尾元素外的其他元素进行数据值更改。我们可以利用双层for循环先计算出斐波那契数组并存入数组中,然后再利用双层for循环输出数据。注意题目中说了我们每个数据输出域宽为5,所以我们利用setw()函数进行控制。更改逻辑:对应位置的元素等于上一行的同一列数据加上一行的前一列数据。不会,因为只有当size为3的时候才会进入相加运算的代码。本题需要我们根据题目中给出的数n,输出n行斐波那契数组。

2025-03-13 16:36:41 142

原创 算法题(95):斐波那契数列

由于斐波那契数列是一个单调递增的数列,所以我们只需要找出紧邻num的两个斐波那契数,然后判断一下是小于num的数距离更小还是大于num的数距离更小,输出更小的那个距离就可以了。left表示前两个位的数据,right表示前一个位的数据,利用他们进行计算就可以避免使用i来控制,达到动态使用数组的目的,减少开的空间。本题需要我们找出与num距离最近的斐波那契数,并返回他们之间的距离(因为每次操作只会移动一位,所以距离就等于操作次数)2.大于num,进行判断,返回距离更小的值。

2025-03-13 16:07:43 169

原创 算法题(94):除2!

策略证明:由于我们的奇数不可以进行操作,所以不考虑,然后偶数中,越大的数据除2,所造成的数据值减少越大,所以每次都对目前最大的偶数除2就可以达到全局最小。使用大堆可以用比暴力查找更少的时间完成最大数据的提取,其实本题也可以解释为查找前k个最大偶数,不过这前k个是动态的。本题需要我们对n个数据中的偶数数据进行不大于k次除2操作,使得n个数据的总和最小。分类2:变成了偶数,如果不删除,那么后续我们插入除2后的数据就会导致数据冗余了。贪心策略:我们每次都对目前最大的偶数进行除2的操作。

2025-03-12 23:30:32 453

原创 算法题(93):dd 爱框框

当区间数据和大于等于x时,计算区间大小,若区间比当前的最小区间更小就更新最小区间和区间边界值。无论是否区间更小,我们都要缩小区间,让left++,并更新和的值。2.虽然大于等于min_distance的区间都满足,但是最后输出的是最先出现的区间,所以除了小于的区间可以更新外,其他情况都可以忽略了。本题需要我们找到满足连续区间数据和大于等于x的区间的边界索引,且该区间若有多个,取的是左边界最小的。1.数据和大于x执行的是循环,这是因为很可能左边界附近的值较小,减完左边的值后,仍然满足条件一。

2025-03-12 19:15:19 281

原创 算法题(92):数组中两个字符串的最小距离

我们可以利用pos1负责指向str1的位置,pos2负责指向str2的位置,且由于str1与str2在strs中不是唯一的数据,所以我们在遍历的过程中还需要不断更新两个指针,以搜索出所有可能的最小距离。mindistance表示最短距离,初始设置为1e6是因为两个字符串最大距离只有可能是1e5,若后续没有更新mindistance还可以用它作为判断是否str1和str2都在strs中的条件。本题需要我们根据字符串数组strs的内容,查找str1和str2的最小距离。

2025-03-11 20:08:53 159

原创 Linux:基本指令与内涵理解

其中不写就,查看默认是我们看到这里有些是以d开头的,有些是-开头的。这里我们的t1文件夹(目录)有一个test.c文件,正常来说我们会将t1中的文件test.c显示出来,使用-d选项后,我们就只显示目录本身。

2025-03-11 15:48:57 2427

原创 算法题(91):点击消除

由于题目中说了点击足够多次,所以我们不需要每次都遍历字符串进行消除操作,而是用栈来模拟字符插入的过程,只要是相邻的相同字母就直接从栈中移除,其他的就插入栈中。由于栈只能取顶部数据,会导致倒序输出,所以我们先把栈的数据倒着存到vector中,然后再反转vector输出数据。本题需要我们将输入的字符串相邻相同字符消除然后保持原本的相对位置输出消除结果。题目中说了空串需要返回0,所以我们这里对空串情况特殊处理。1.将stack数据转移到vector。2.逆转vector数据,输出数据。

2025-03-10 11:06:54 261

原创 算法题(90):队列安排

本题的数据是按顺序依次插入的,所以我们不需要模拟出地址,只需要知道数据i前是什么数据,后是什么数据即可(也就是有prv和ne即可)由于本题数据量比较大,所以不能用list容器来实现指令,因为涉及查找,如果直接用库的find会导致时间复杂度在n^2。涉及插入和删除操作,若用顺序表会导致挪动数据很麻烦,用单链表又无法快速找到对应数据的前一个数据,所以我们用双链表。如果删除过了就continue,没删除过就改变指向进行删除,然后将判断置为true。本题需要我们完成题目对应操作并返回操作完的队列的编号顺序。

2025-03-09 21:45:33 216

空空如也

空空如也

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

TA关注的人

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