![](https://img-blog.csdnimg.cn/direct/285a7c95949345cf9a2dd9a53fc1ad87.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
OJ题
文章平均质量分 89
主要分享一些OJ题
zxctscl
万事试一试
展开
-
【OJ】stack刷题
在没有遇到第一个算符之前,就把数据入栈,当遇到运算符,就把它前面两个数2和1出,计算出来结果就是2+1=3,然后再把这个3再入栈;当再一次遇到表达式时候,又把它的前面两个数出栈做对应的运算之后,在把算出的结果入栈,最后输出栈顶元素就可以了。因为再删除数据的时候,当a栈顶出栈的时候,_min栈顶同时也得出栈,这样才能保证_min.top()里面能够保存的是最小值。先把入栈序列入栈,如果出现入栈序列和出栈序列的栈顶元素相同,那么两边就同时出数据,直到入栈序列和出栈序列的栈顶元素不匹配,或者出栈序列为空。原创 2024-04-07 08:45:37 · 870 阅读 · 25 评论 -
【OJ】动规练习七之【模板】01背包
第二种情况:选择i物品,那么必须有w[i],实现的价值最大,就得从i-1里面挑价值最大的出来,并且此时体积要改变,所以到这里的体积必须能够装下v[i],到i-1位置体积就必须小于j-v[i],但是这里必须判断dp[i][j]是不是等于-1,所以这里的状态表示就是dp[i][j]不是等于-1情况下w[i]+dp[i-1][j-v[i]]第一种情况:不选择i物品,那么就是在i-1里面选择,并且体积也依旧小于j,所以就是dp[i-1][j]它依赖它的上一行位置,i-1表示的是上一行,从上往下。原创 2024-04-05 22:35:41 · 1069 阅读 · 10 评论 -
【OJ】动规练习六
上升”**状态下,最长的湍流数组长度**g[i]原创 2024-04-04 22:49:16 · 1199 阅读 · 12 评论 -
【OJ】动归练习五之子组串
另一种情况就是不止一个数就是i-1最小的子数组乘积f[i-1]乘i位置对应的nums[i],但是这里的nums[i]可能是小于0,所以这里还得分两种情况:一个是nums[i]>0,那么就是最小的子数组乘积g[i-1]乘i位置对应的nums[i];然后取这两种情况的最小值。另一种情况就是不止一个数就是i-1最大的子数组乘积为负数的最长长度,如果num[i]>0,长度就为就是以i-1为结尾的子数组乘积为负数的最长长度再加1,也不能直接加一,先判断判断g[i-1]是否等于0,是就是0,不是就取g[i-1]+1;原创 2024-03-30 11:29:37 · 1332 阅读 · 20 评论 -
【OJ】动归练习三
这里得注意下标的映射,此时在dp[i][j]位置就对应frame[i-1][j-1],写代码时候得注意。要在[i][j]位置时候得到最大价值,要么从它上面的一个下来,要么从它左边一个过来,但是选择的是价值更大的那一个,再加上它本身那一个所对应的价值。想要到达[i][j]位置有三种方式[i-1][j-1]和[i-1][j]还有[i-1][j+1],以[i][j]位置为结尾,表示到达[i][j]位置时,此时的最大价值。dp[i][j]表示到达[i][j]位置时,最小路径和。以[i][j]为结尾,找最小和。原创 2024-03-27 21:41:39 · 984 阅读 · 16 评论 -
【OJ】vector刷题
对于任意一个在数组 nums 中出现两次的元素,该元素的两次出现会被包含在同一类中,对于任意一个在数组 nums中只出现了一次的元素它们会被包含在不同类中。因此,如果我们将每一类的元素全部异或起来,那么其中一类会得到第一个出现一次的元素,另一类会得到第一个出现一次的另一个元素,这样我们就找出了这两个只出现一次的元素。直接遍历一遍顺序表里面的元素,再进行异或,其他出现过不止一次的数据就会在进行异或的时候为0,那么返回的最终结果就是只出现一次的数。如果某一个数字只出现一次,那么进行异或返回的结果就是它本身。原创 2024-03-26 16:32:37 · 949 阅读 · 13 评论 -
【OJ】动归练习四
如果不选择这个位置,那么它前面的位置i-1也可以选也可以不选,如果选就是f[i-1],如果不选择就是g[i-1],比较一下取大的一个就行,这个时候的状态转移方程就是g[i]=max(f[i-1],g[i-1])。如果不选择这个位置,那么它前面的位置i-1也可以选也可以不选,如果选就是f[i-1],如果不选择就是g[i-1],比较一下取大的一个就行,这个时候的状态转移方程就是g[i]=max(f[i-1],g[i-1])。得考虑第一个位置,如果选择,那么就是这个位置对应的值f[0]=nums[0];原创 2024-03-28 17:13:08 · 1230 阅读 · 14 评论 -
【OJ】动归练习二
226就有三种解码方式:它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6)当要在新的dp表里面2的结果就要用到0和1位置的值。这里dp[0]=1,要想在2位置解码成功,那么0位置必须是解码成功的。在旧的初始化列表中,初始化dp[1]是比较麻烦的,如果把它放在填表位置就会比较轻松。在新的dp表里面的i统一都对应把位置往后面移动了一位,这里在写代码的时候就得减1。题目也说,一个单独的数字可以映射的,但是这个数字前面是0的话就不可以。多开一个虚拟位置,有什么用呢?原创 2024-03-25 22:31:55 · 1187 阅读 · 6 评论 -
【OJ】动归练习一
做动态规划的题目,有个固定的模式,1.状态表示;2.状态转移方程;3.初始化;4.填表顺序;5.确定返回值。原创 2024-03-21 20:26:46 · 1549 阅读 · 16 评论 -
【OJ】string类刷题
这里用 reverse翻转的时候区间选择与k有关,以例1为例:发现第一个翻转区间是[0,2),也就从i=0到i+k,得注意区间是左闭右开的;第二个翻转区间是[4,6),也就是i=4到n, reverse的结束就得取i+k和n中小的那一个。用vector 存储num1和num2每个数相乘的值,就类似于列竖式做乘法的原理,来实现对相乘结果的存储,这里不进位相乘。,遍历字符串,当遇到空格时候,进行reverse翻转,区间从开始记录单词的位置,到空格位置。然后将a跳过空格位置,又开始记录下一个单词开始位置。原创 2024-03-18 17:04:41 · 948 阅读 · 3 评论 -
【OJ】string类题目
这里用getline得到输入的一行单词,要获取最后一个单词的长度,那么就得先找到最后一个单词。在string中有一个rfind是从后往前找,只需要找到第一个空格位置,在这个位置后面一个位置,那就是最后一个单词开始位置,记录下这个位置。然后用size减去这个位置加1就是最后一个单词的长度。原创 2024-03-16 17:52:46 · 1042 阅读 · 25 评论 -
【OJ】二叉树的遍历
不为空,就在数组里面记录下root的val值,然后先对左子树进行递归,再对右子树进行递归。这里考察二叉树的前序遍历,遍历用递归就可以了,但是这里题目要求给的是遍历返回的是二叉树对应值前序遍历的结果,还要求按数组输出。也就将遍历的函数改为:先遍历左子树,然后数组来记录中间root的val值,再是右子树。也就将遍历的函数改为:先遍历左子树,再是右子树,最后数组来记录右边root的val值,这题和上面前序遍历是一样的思路,就是把遍历节点的顺序该一下,其他都相同。为了数组好利用下标访问,定义一个变量i。原创 2024-03-11 21:09:32 · 788 阅读 · 1 评论 -
【OJ】日期差值与日期累加
循环结束时候1的年月与2的年月是一样的,这时候直接让d1 - d2,就是在相同年月下的差值,再加上之前的sum就是相差的日期。因为每个月的日期不一样,可以写一个获取每个月日期的函数,只是在2月份的时候,闰年就返回29,平年就是28。先比较年,年如果相同就比较月,月如果相同就比较日,如果1的都大于2的就是正确,否则就返回false。在写main时候,得注意输入,题目要求的是年月日相连直接输入,在写输入的时候得注意格式。当年月都相同时候,日期直接相减就能得到相差的日期,顾在写判断的时候就写为。原创 2024-03-06 19:02:13 · 587 阅读 · 13 评论 -
【OJ】求和与计算日期
下面两个题目均来自牛客,使用的编程语言是c++,分享个人的一些思路和代码。原创 2024-03-04 21:32:11 · 542 阅读 · 5 评论 -
【OJ】牛客链表刷题
这里两道与链表有关的题目均来自牛客。原创 2024-01-18 23:08:22 · 726 阅读 · 14 评论 -
【OJ】链表刷题
可以先判断是否相交,如果A和B两个链表的尾节点的地址都相同,那么就A和B两个链表相交。如果如果A和B两个链表的尾节点的地址不相同,那么就A和B两个链表不相交。当A的第一个节点在B中没有找到相交时,A节点就往后走,继续像第一个节点判断方式一样。不过这里得注意一下,再次访问B链表时候,B的走的节点又得从头节点开始。先取A的节点,在B链表中遍历一遍,判断B中节点与A是否相交,如果相交,直接返回A的节点,如果不相交,B节点继续往后走。对于节点的拷贝就是申请节点放原节点值任何尾插就行,复制链表倒是容易的。原创 2024-01-16 21:22:06 · 1127 阅读 · 21 评论 -
【OJ】环形链表
从开始位置相遇时slow走的距离是L+X,从开始点相遇时到fast走的距离是L+n*C+X。与上一题类似,也使用快慢指针,不同的是这里不需要找出相遇点的位置,只需要判断是不是有环就行。假设将起点到入环口点距离记为L,入口点到相遇点的位置记为X,环的长度记为C。当两个指针都进入环以后,slow开始追击fast,到某一个位置会相遇。结论:一个指针从相遇点开始走,一个指针从头开始,它们会在入口点相遇。slow进环后,fast和slow的距离每次追击都会缩减1。带环链表:尾节点的next指向链表中的任意节点。原创 2024-01-14 22:33:03 · 576 阅读 · 5 评论 -
【OJ】单链表刷题
这里肯定要事先判断一下这两个链表是不是为空:如果链表1为空,就直接返回链表2。要将原来的链表进行反转,很容易想到,将原来的节点取下来,然后一个一个进行头插到新链表中。的两个链表,这里就可以用尾插,比较两个链表节点的val,对比一下,取小的进行尾插。在已有的链表上面经行插入比较繁琐,就直接用一个新的,最后返回排好链表的头节点就行。如果cur为空,这里就需要一个新的链表,所以最后不要忘记返回新链表的头节点。只有两个链表都不为空时,再考虑是链表1节点的val与链表2的val:如果。置为新链表的头节点。原创 2024-01-05 21:03:16 · 1237 阅读 · 17 评论 -
【力扣】移除链表元素203
这里开始介绍从网上一些刷题网站上的题目,在这里做一些分享,和学习记录。先来介绍一些力扣的OJ题目。这里的OJ就是我们不需要写主函数,力扣会提供一个接口,在力扣中会调用我们所写的代码和它后台的匹配,从而判断我们写的代码正确性。原创 2023-12-09 22:47:01 · 1034 阅读 · 1 评论