算法
文章平均质量分 74
日常刷题
UrSpecial
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
一二维前缀和/差分详解
高效处理数组与矩阵的区间操作,本质是空间与时间的战略置换!从一维到二维逐级递进,详细阐述每一种类型。原创 2025-06-08 00:24:59 · 677 阅读 · 0 评论 -
【笔试强训day38】
文章摘要:本文介绍了三个算法题目及其解决方案。第一题“天使果冻”要求在前x个果冻中找出美味度第二大的果冻,通过维护最大值和次大值数组实现快速查询。第二题“dd爱旋转”涉及矩阵的180度旋转和行镜像操作,通过统计操作次数并应用行镜像和列镜像来实现。第三题“小红取数”要求在数组中选择一些数,使其和尽可能大且为k的倍数,使用动态规划方法解决,通过状态转移方程计算最大和。每个题目都提供了详细的解题思路和代码实现。原创 2025-05-22 23:12:33 · 1111 阅读 · 0 评论 -
【笔试强训day37】
本文介绍了三个算法问题的解决方案。第一题是旋转字符串,通过将字符串A倍增并在其中查找字符串B来判断是否可以通过旋转得到B,时间复杂度为O(n)。第二题是合并k个已排序的链表,使用小堆(优先队列)将所有链表的头节点放入堆中,依次取出最小节点并合并,时间复杂度为O(nlogn)。第三题是滑雪问题,通过记忆化搜索计算矩阵中最长的递减路径,避免重复计算,时间复杂度为O(nm)。每个问题都提供了详细的解题思路和代码实现。原创 2025-05-20 22:25:22 · 922 阅读 · 0 评论 -
求n的阶乘(递归与非递归)
double类型比int类型的范围大,能更大程度上避免溢出。原创 2023-10-21 19:55:32 · 150 阅读 · 1 评论 -
3种方法求一个整数的二进制中1的个数
十进制 n ,要判断 n 的个位(最后一位)是否等于m(m原创 2023-11-07 23:09:52 · 419 阅读 · 0 评论 -
三种方法解决轮转数组问题
题目描述给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。原创 2023-12-11 16:29:17 · 537 阅读 · 0 评论 -
求两个整数的最大公约数
分别让变量m和n存储两个数的值,如果n为0,那么停止操作,m中的值是最大公约数(GCD);否则计算m除以n的余数,把n保存到m中,并把余数保存到n中。(remainder表示余数,把余数保存到n中)欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。1997 ÷ 615 = 3 (余 152)反复做除法运算,当余数为 0 时,取当前。615 ÷ 152 = 4(余7)152 ÷ 7 = 21(余5)7 ÷ 5 = 1 (余2)5 ÷ 2 = 2 (余1)2 ÷ 1 = 2 (余0)原创 2023-10-22 11:45:15 · 773 阅读 · 1 评论 -
猜数字小游戏
在rand函数使用前需要调用srand函数设置随机数生成的基准值,可以用time函数的返回值做基准值。>在一次程序运行中,只需要设置一次基准值,后面可以生成多个随机数。>生成a~b之间的随机数的方法:a + rand%(b-a+1)>rand函数生成随机数范围在0~32767之间。调用rand函数、srand函数和time函数。注意此处的强制类型转换,NULL为空指针。原创 2023-10-28 17:28:50 · 104 阅读 · 1 评论 -
巧解月份的天数
输入年份和月份,输出该月的天数。不难发现,只有在闰年的二月份才会特殊情况,因此我们需要单独处理这一特殊情况。下面我们利用【数组】来解决。原创 2023-10-28 18:00:31 · 112 阅读 · 1 评论 -
C语言实现扫雷(附源码)
首先简单的讲讲扫雷的规则:每次点开一个格子,如果是雷,将会被炸死,游戏结束;如果不是雷,那么将统计该格子周围的雷的个数。原创 2023-11-02 18:24:24 · 163 阅读 · 0 评论 -
利用循环与递归解决喝汽水问题
下面我们再继续输入几组数据 ,看看规律如何。5块钱--------9瓶7块钱--------13瓶20块钱------39瓶……推出:喝的汽水总数= 2 * monny - 1基于这个规律,我们可用更简单的代码来解决这个问题。int main()printf("请输入你有多少钱:");return 0;原创 2023-11-16 23:05:28 · 245 阅读 · 0 评论 -
合并两个有序数列
题目描述:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。数据范围: 1≤n,m≤1000 , 序列中的值满足 0≤val≤30000。输入描述:输入包含三行,第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。第二行包含n个整数,用空格分隔。第三行包含m个整数,用空格分隔。输出描述:输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。原创 2023-11-01 23:39:13 · 406 阅读 · 1 评论 -
求解素数的n重境界(筛选法,试除法)
在上述代码中,我们不难发现6既是2的倍数,又是3的倍数,因此6被重复筛选,为了提高效率,我们可以从素数的平方开始往后筛选,减少了被重复筛选的数字,尤其是在大范围筛选中得到体现,极大提高了程序的效率。1既不是质数,也不是合数,因此首先就要把1划去,2是最小的素数,所以2不能筛去,但是区间内2的倍数要全部筛去,接着3是素数,3也不能筛去,同理3的倍数要全部筛去,然后留下5,7,筛去其全部倍数。而筛选法不是如此,筛选法是将不是素数的数全部去除,然后得到余下的数为素数 ,实现素数的查找。【运用到的数学定理】原创 2023-10-24 22:34:18 · 202 阅读 · 0 评论 -
详解杨辉三角
我们只需要在上述代码里头加上一个for循环即可。下面 我们来分析如何打印空格。进行到这,就差把空格补上了。下面将谈谈如何把空格补上。//定义两个宏,方便修改。原创 2023-11-21 22:49:07 · 221 阅读 · 0 评论 -
C语言如何实现strcpy函数
char*strcpy(charconstcharstrSource以上摘自MSDN。在文档中我们可以了解到:> strcpy是一个字符串拷贝函数> 函数有两个参数,参数的类型为char*,第一个参数为目标空间的首地址,第二个参数为源字符串 的首地址> 函数的返回类型为 char*> 函数返回值为目标空间首地址(Each of these functions returns the destination string)> 源字符串必须以‘ \0 ’结束。原创 2023-11-08 17:17:53 · 255 阅读 · 0 评论 -
【求1加到n的阶乘】
【代码】【求1加到n的阶乘】原创 2023-10-21 17:51:15 · 107 阅读 · 1 评论 -
C语言求最小公倍数的3种方法
两个数的最小公倍数一定大于或等于这两个数中的较大值,根据这一规律,我们可以直接从这两个数中的较大数开始,依次加1,加1得到的结果拿来试除这两个数,直到能同时被这两个数整除。例如,求 2 和 3 的最小公倍数。3较大,引入一个变量num,num>=3,从num = 3开始,num % 2!= 0,所以num++,变为4, 4 % 3!= 0,继续执行num++,变为5, 5 % 2!= 0,num++,变为6, 6 % 2 = 0,6 % 3 = 0。所以2 和 3 的最小公倍数为6。原创 2023-11-02 20:25:28 · 15650 阅读 · 2 评论 -
矩阵转置问题
输入描述:第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。输出描述:输出m行n列,为矩阵转置后的结果。每个数后面有一个空格。示例1输入:2 31 2 34 5 6复制输出:1 42 53 6问题分析。原创 2023-11-02 00:29:20 · 115 阅读 · 0 评论 -
常规方法和曼哈顿距离法打印菱形
对于打印菱形,我们可以把菱形一分为二找规律,也就是说,分别对上半部分和下半部分分析,找到它们各自的规律。设行号为 i ,上半部分行数为line_up, 则星号*的数量 = 2 * i + 1,空格数 = line_up - 1 - i。距离——两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。4 - 1 - 0即line_down - 1 - i, 式子最后+1,1是指红色分割线上的星号。4 - 1 - 1为 line_down - 1 - i, i 此时为1。原创 2023-11-20 16:34:29 · 327 阅读 · 0 评论 -
应用递归拆解整数并将各个位数相加
我们的目的是让这3次调用中的sum相加,也就是说这3次函数调用中sum会互相影响以达到累加的效果,但该程序的执行结果并不符合我们的预期。原因是在3次递归调用中,函数创建的局部变量都是相互独立的,它们占用不同的空间,因此,互不影响,从而没有累加的效果。所谓全局变量,它是储存在静态区的,而且在工程内部任意地方都可以使用,因为在整个程序执行的过程中只创建一次sum,只开辟一次空间,所以就不存在上述案例中创建了多个地址不同的sum导致sum之间不能进行累加的问题。很明显,输出结构时错误的,正确的结果应该是6。原创 2023-11-05 11:12:27 · 284 阅读 · 1 评论 -
C语言求第n个斐波那契数(递归与迭代)
斐波那契数列:1 1 2 3 5 8 13 21 34 55 89......通过观察,我们不难发现,其规律为:从第三个数开始,前两个数的和等于后一个数。基于此规律,下面将给出用递归来求斐波那契数和非递归求斐波那契数的方法,并比较这两种方法的优缺点。首先讲讲递归的方法。原创 2023-11-03 23:49:07 · 461 阅读 · 0 评论 -
【二叉树】非递归实现前中后序遍历
根左子树 右子树2)中序:左子树根右子树3)后序:左子树 右子树根可以看出,这三种遍历方式的本质区别在于什么时候访问根节点,下面将介绍一种很厉害的思想,对于前中后序的非递归实现,它可以是通解。原创 2024-05-28 09:52:46 · 1164 阅读 · 1 评论 -
中缀表达式转后缀表达式(逆波兰表达式)及如何计算后缀表达式
首先说说什么是中缀表达式,中缀表达式中,操作符是以中缀形式处于操作数的中间。例如,在表达式“3 + 4”中,“+”是中缀操作符,位于两个操作数“3”和“4”之间。对于我们而言,它最直观。下面说说后缀表达式,逆波兰表达式(Reverse Polish Notation,RPN),也被称为后缀表达式,是一种算术表达式的表示方法。在这种表示法中,运算符被写在操作数的后面,而不是像常规的中缀表达式那样写在操作数的中间。原创 2024-10-20 18:43:10 · 1218 阅读 · 0 评论 -
【堆、快速选择排序】探寻TopK问题的解决方案
TopK问题在面试中常常被问到 —— 比如,在10亿个整数里,找出最大的前100个。在海量数据中查找出重复出现的元素或者去除重复出现的元素也是常考的问题。所以在对待TopK问题上,我们可不敢掉以轻心。下面,我们进入正题。TopK问题就是在一个数据集合中找出最大的前K个或者最小的前K个。在面试中遇到这个问题时,通常它的数据量很大,动不动就上亿或者海量数据。这就导致我们无法直接在内存中对所有数据进行排序或者说排序的时间成本很高等等,因此这类问题通常不采取直接排序再查找的做法。下面我们看看几种常见的做法。原创 2024-09-04 09:05:44 · 1183 阅读 · 0 评论 -
【笔试强训day17】
这样,在遍历到(i,j)这个元素的时候,我们直接去存储行之和的数组和存储列之和的数组了拿数据就可以了,减少了很多计算。综上,第一天吃或者第三天吃得到的快乐值最大,但是第三题吃羞耻度会小于第一天吃,所以最终选择第三天吃。通过上面的演示,可以看到这题就是一道固定长度的滑动窗口问题,窗口长度为k(效果持续的天数)。如果第一天吃下,快乐值会持续两天(k = 2),快乐值总和为8(第一天获得快乐值为3,第二天获得快乐值为5),羞耻度总和为10.因为1+2+3=6,1+2+4=7,1+3+4=8,2+3+4=9。原创 2025-04-13 00:36:27 · 846 阅读 · 0 评论 -
【笔试强训day18】
TopK问题。 这道题只需按照订制的排序方法排序,然后取前k个即可。关键在于制定排序方法——如果甜度不相等,甜度高的排在前面;如果甜度相等,对应酸度小的排在前面。然后注意数据范围即可。原创 2025-04-13 20:22:17 · 990 阅读 · 0 评论 -
【笔试强训day15】
dd当上了宣传委员,开始组织迎新晚会,已知班里有n个同学,每个同学有且仅有一个擅长的声部,把同学们分成恰好m组,为了不搞砸节目,每一组里的同学都必须擅长同一个声部,当然,不同组同学擅长同一个声部的情况是可以出现的,毕竟一个声部也可以分成好几个part进行表演,但是他不希望出现任何一组的人过多,否则可能会导致场地分配不协调,也就是说,她希望人数最多的小组的人尽可能少,除此之外,对组内人员分配没有其他要求,她希望你告诉她,这个值是多少,如果无法顺利安排,请输出-1。问题是,枚举到哪,也就是枚举的上限是多少?原创 2025-04-11 01:50:59 · 657 阅读 · 0 评论 -
【笔试强训day14】
预处理用做的就是:统计数组中每个数字的总和,存放进一个hash数组中,由题意,选中一个数以后,该数+1和-1的数就不能再选,在hash数组中的表现就是,选中一个数后,它的相邻位置就不能再选了(类似于打家劫舍问题,不知道也没关系)。如果选择 i 位置的值,那么前面i - 1位置就不能选,就是f [ i ] 的最大值就是i对应的和+不选i - 1位置的最大分数,而不选 i - 1的最大分数就是存在g[i - 1]中,故得到f[i]的状态表示。圈起来的数就是我们取到的最大的水平值。把取出的这些数加起来就是答案。原创 2025-04-10 00:23:16 · 1086 阅读 · 0 评论 -
【算法基础】高精度加减乘除法
这里顺带说明一下数组要开多大,也就是下面代码中N要定为多大的值。高精度加减乘除法都是一样的道理。比如高精度加法中,数据大小不超过10^500,那么开501个长度就够用了。个位为10^0,十位为10^1,百位为10^2,长度为三的数组可以表示到999,所以3位长度已经足以表示不超过10^2的数了,进而501个长度也足以表示不超过10^500的数了。当然,我们也可以开大一点,N = 1e6 + 10,这样就绝对完全够用了。原创 2025-04-17 09:50:05 · 948 阅读 · 0 评论 -
【笔试强训day21】
区间两端的字符相同,那么去区间 [ i + 1,j - 1]找到该区间内最长的回文子序列,然后加上两端的那两个字符就得到了[ i , j ] 区间上的最长回文子序列。状态转移方程 ---------> dp [ i ] [ j ] = dp [ i + 1, j - 1] + 2;原创 2025-04-18 00:16:42 · 1052 阅读 · 0 评论 -
【笔试强训day16】
遍历字符串A,遇到%则判断它的后面一个字符是不是s,如果是的话,就替换成arg中的字符。比如字符串A中 i 位置对应的字符是%,那么在确保 i + 1不越界的情况下去检查 i + 1位置的字符是否为s,如果是的话, 就把arg中对应的字符拿过来替换,然后指针指向arg的下一个位置。给定一个很长的 DNA 序列,以及限定的子串长度 N ,请帮助研究人员在给出的 DNA 序列中从左往右找出 GC-Ratio 最高且长度为 N 的第一个子串。14本身不是质数,但是14可以组合出41,是质数,所以14是神奇数。原创 2025-04-11 21:38:03 · 837 阅读 · 0 评论 -
【笔试强训day20】
根据上图,我们可以看到,对于 i 位置,它可以独立成一个子数组,那么它的最大和就是arr[ i ]。当然,i 也可以和前面的结合形成子数组,它可能和前面的一个元素结合,也可能两个三个甚至全部元素结合形成子数组,在那么多的情况中,只取以i - 1位置为结尾的子数组最大和,而这个最大和正好是存放在dp[i - 1]中。所以最大和就是dp[i - 1] + arr[i]。原创 2025-04-16 11:32:09 · 892 阅读 · 0 评论 -
【笔试强训day19】
双指针。两个指针分别从两端开始向中间靠拢,如果left对应的字符串和right指向的字符串中有相同的字符,那么就有可能组成回文串。反之,则不可能。原创 2025-04-14 22:46:03 · 911 阅读 · 0 评论 -
【笔试强训day13】
题目描述:来源:牛客网牛牛最近在玩炉石传说,这是一款一对一对战的卡牌游戏,牛牛打算努力冲上钻五分段,获得丰厚的天梯奖励。炉石传说的段位可以用星数来表示,具体规则为:若牛牛本场失败,则扣除一星;若牛牛本场获胜,需要看牛牛是否触发了连胜奖励,若牛牛获得了至少三连胜(即本局对局的上一局和上上局都获胜)则获得kkk星,否则获得一星。现在给出牛牛游玩的nnn场记录,请你判断牛牛最终的星数和初始星数的差。原创 2025-04-09 00:24:42 · 1061 阅读 · 0 评论 -
【二分查找详解】
左边的所有元素,将范围调整为6到10之间。定义 left= 0,right = 9(均为下标),mid 为元素5的下标,在与5比对之后right 不变,left 应改为 mid + 1,接着继续查找。假设第一次是与5比对,目标元素为7,那么此时,目标元素大于被比对元素,可以排除5。原创 2023-10-16 17:41:20 · 82 阅读 · 1 评论 -
【冒泡排序】
显然,此时的数列已经按照要求排列好了,再去对该数列排序就是多此一举。然而,未经优化的代码就是多此一举,从外层for循环进入到内层for循环,所有数字均为交换位置,这意味着这组数字已经排好序了。冒泡排序就是从序列中的第一个元素开始,依次对相邻的两个元素进行比较,如果前一个元素大于后一个元素则交换它们的位置;才会跳出for循环,在此期间进行了好多次无意义大循环,效率很低,这就是未优化代码的缺点。依然可以通过1==flag进入后一个if语句跳出循环,停止往后不必要的循环。当数列按照顺序排列好之后,即使。原创 2023-08-23 22:22:26 · 73 阅读 · 0 评论 -
【汉诺塔问题解析】
并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。将a柱上的64片圆盘规定移动到c柱上,一共需要移动约1800亿亿步(18,446,744,073,709,551,615),才能最终完成整个过程。1.将c柱作为辅助,把a柱上的n-1片圆盘移到b柱上。3.将a柱作为辅助,将b上的n-1个圆盘移动到c柱上。1.将c柱作为辅助,把a柱的上面2个圆盘移到b柱上。3.将a柱作为辅助,将b上的2个圆盘移动到c柱上。2.将a柱最下方的第n个圆盘移到c柱上。2片圆盘需要3步完成。原创 2023-08-25 17:55:34 · 701 阅读 · 1 评论 -
【逆序输出详解】
>利用算数分割逆序输出数字的方法>利用scanf函数,在输入时对整数进行切分,从而避免了算数分割以上两种方法对于正整数来说是完全可行的,但是当用户输入负数时,可能无法得到想要的答案。因此,我将在篇末介绍对于正负整数都适用的第三种方法。>逆序输出正负整数的通法原创 2023-10-10 13:08:57 · 1927 阅读 · 1 评论
分享