
算法
文章平均质量分 84
金创想
这个作者很懒,什么都没留下…
展开
-
1秒写出逻辑运算符的优先级判定表达式
如果你懒得动脑,且又一把子力气无处安放,可以试试把所有情况全部输出出来,让电脑帮咱找出那些输出结果不同的。通过将括号放到不同的位置,改变运算的优先级,然后看第1个表达式的输出结果与后面哪个表达式相同,即可简单判断出他们的优先级。这个力气咱不白花,细心观察,你会发现一个规律:头尾两个数,与&&挨着的必须是0,与||挨着的必须是1。这段代码考验脑筋的地方在于,要巧秒配置1和0,使括号放在表达式前面、后面的输出结果是不一样的。知道了这个规律,下次你忘了他们三个的优先级,就可以立刻无脑写出用于验证的表达式。原创 2025-01-17 16:55:40 · 1139 阅读 · 0 评论 -
整数的分离与合成
整数是由数字和数位组成的,比如327是一个三位数,它的数字是3、2、7,数位是个数、十位、百位。经常有些题目考查将一个整数拆分成各个数字,以及将各个数字合成一个整数,下面分别就此讨论。注:只考虑正整数,只涉及整数拆成单个数字,单个数字合成整数的情况,不考虑整数拆成多个整数,多个整数合成一个整数的情况。原创 2025-01-16 20:00:00 · 654 阅读 · 0 评论 -
排序的本质、数据类型及算法选择
包含多个属性的数据,可能需要根据一个或多个属性进行排序。例如,学生的成绩,可以以总成绩为主关键字、以单科成绩为次关键字一起排序。按字母顺序对单词或句子进行排序,看着是字母,实际上排的是ASCII码,而ASCII码就是数字。排序,从字面上理解,就是把一堆乱糟糟的东西按照一定的规则排得整整齐齐,使无序变有序。如地理坐标(经纬度)、版本号(如软件版本号)、IP地址等,它们也有特定的排序规则。对于编程来讲,排序就是将数字按从小到大的顺序排列。没错,无论排什么,最终本质上排的都是数字。是不是赏心悦目好多?原创 2025-01-10 20:00:00 · 1490 阅读 · 0 评论 -
十大排序简介
十大排序是在计算机地界儿最常用和最重要的排序算法,分别是:冒泡、选择、插入、希尔、归并、快速、堆、计数、基数、桶。原创 2025-01-08 17:00:00 · 1748 阅读 · 0 评论 -
衡量算法效率的方法:时间复杂度、空间复杂度
算法在运行过程中临时占用的存储空间因算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地”进行的,是节省存储空间的算法;有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,如归并排序。大O函数的数学定义:存在正常数c和某个规模n0,如果对所有的n≥n0,都有f(n)≤cT(n),则称f(n)为T(n)的大O函数,写成f(n)=O(T(n))。前面的T(n)简化为O(T(n))=O(n。原创 2025-01-06 20:00:00 · 1704 阅读 · 0 评论 -
动态规划简介:爱的初体验
假设已经知道数组After的子数组的最大和为All[1](All[i]指下标为i到n-1的数组的子数组的最大和),并且已经知道After中包含A[1]的子数组的最大和为Start[1](Start[i] 指下标为i到n-1的数组的包含第i个元素的子数组的最大和)。对应地,背包内装入物品的最大价值也分为两部分:第i件物品的价值v[i]、前i-1件物品装入容量为v-c[i]的最大价值,即此时的最大价值为v[i] + f[i-1][v-c[i]]。, A[n-1]}……第i件物品的体积是c[i],价值是v[i]原创 2024-12-28 19:50:22 · 1216 阅读 · 0 评论 -
“计算几何”简介
关系判断涉及到各种几何图形之间的关系,比如判断点是否在线段上、两线段是否相交、线段和直线是否相交、矩形是否包含点、点是否在多边形中、线段是否在多边形内。计算几何常用的几何数据有点(Point)、向量(Vector)、线段(Line Segment)、直线(Line)、多边形(Polygon)等,这些基本上都可以用结构体实现。还有一些比较典型的算法,如点到线段的距离、多边形的遍历、凸包算法(Graham扫描法、Jarvis步走法)、最近点对查找、三角剖分等,这些算法都在计算几何中发挥着关键作用。原创 2024-12-24 20:00:00 · 677 阅读 · 0 评论 -
有向无环图的拓扑排序——CSP-J1真题讲解
你看到 (1,2),(1,3),(2,4),(3,4)这样的数据,这是什么样的数据呢?下面就来做一下这道题,题中给出了4条有向边:(1,2),(1,3),(2,4),和(3,4),也就是4种单相思关系:1爱2,1爱3,2爱4,3爱4。考虑一个有向无环图,该图包括4条有向边:(1,2),(1,3),(2,4),和(3,4)。对于一个有向无环图,拓扑排序是将图的所有顶点排成一个线性序列,使得对于每一条有向边 (u,v),顶点 u 在序列中出现在顶点 v 的前面。所谓的图,就是一堆节点和边。原创 2024-11-03 17:38:28 · 505 阅读 · 0 评论 -
全排列的另一种生成方法:标记数组
此代码和之前给出的套路代码的递归函数的实际意义都是一样的,都是求数组a[]从下标x到下标n的全排列。而之前发的套路代码并无标记数组,而是采用交换不同位置的人的编号的方式,从而自然实现x之前(含x)位置的人就是已排好的,而x之后位置的人就是还没排的。此代码新增了一个标记数组b[i],专门用于标记编号为i的人是否已排列,1表示已排,0表示未排。每次在排第x个位置的人时,都要将所有人逐一过一遍,只排还没排过的人,已排过的就不再排。位置指的是要排列的人的位置,编号是人的代号(可以想象成人名)。int a[15];原创 2024-10-30 18:29:55 · 680 阅读 · 0 评论 -
生成全排列的方法:递归、DFS、回溯进行曲
比如arr={1, 2, 3},backtrack(arr, 0, 2)就是求整个数组的全排列,而backtrack(arr, 1, 2)就是求最后2个元素的全排列,backtrack(arr, 2, 2)就是求最后1个元素的全排列。在运算过程中,通过每次将start递增1不断缩小问题的规模,当开始下标等于结束下标时,要排列的只剩下一个元素,答案显示易见,所以此时递归终止。与排列树有关的问题一般都要用到“回溯算法”(这很好理解,效率越高越好嘛),但这里为简化起见,咱们只生成完整的全排列,不加入约束条件。原创 2024-10-29 16:56:08 · 985 阅读 · 0 评论 -
哈夫曼编码——CSP-J1真题讲解
(2)现在没拼过的节点从小到大为:c:12、d:13、f1:14、e:16、f:45,最小的节点为c、d,拼成新节点f2,频率25。(3)现在没拼过的节点从小到大为:f1:14、e:16、f2:25、f:45,最小的节点为f1、e,拼成新节点f3,频率30。虽然编码不一样,但每个字符的编码长度确是一定的,即长度依次为:4、4、3、3、3、1,根据这个特点也可以快速确定答案为A。(4)现在没拼过的节点从小到大为:f2:25、f3:30、f:45,最小的节点为f2、f3,拼成新节点f4,频率55。原创 2024-09-15 19:43:50 · 1974 阅读 · 0 评论 -
字符串的周期:每一期都有那么几位
首先依次遍历第1个周期内的k个字符s[i](i=0~k-1),然后按纵向扫描的方式让后面每个周期内的对应的字符都与第1个周期内的字符一一比较,但凡遇到一个不相等的(即s[i+n*k]!),就判定k不是s的周期,从而将判断是否为周期的标志变量flag置为0。本代码有三层循环,第一层是周期k的遍历,第二层是第一个周期内字符的遍历,第三层循环是以k为公差的等差数列j的遍历。题目明确说明以长度为k的字符串重复多次得到字符串s,则称s以k为周期,所以字符串的长度len必然是k的倍数,据此可跳过不满足此条件的k。原创 2024-05-20 18:25:10 · 1218 阅读 · 0 评论 -
统计数列中的数字出现次数
关于f[n+1][k]=f[n][k]+x的实现,老金最初也想用一个表达式实现,但是没有成功,只好退而求其次先用一个循环实现f[n+1][k]=f[n][k],不知道有没有高手有更好的方法,还望指点一二。更高效的做法是一次性从1-10000整个遍历一次,针对每个n,分别求出0-9出现的次数,然后把这些数据都存储到数组中。这时候就需要用到二维数组f[n][k]统计数次,n表示前n个整数,k表示0-9。显然有f[n+1][k]=f[n][k]+x(x是k在整数n+1中出现的次数)如想进一步了解详见“原创 2024-05-18 11:55:05 · 872 阅读 · 0 评论 -
化学式的分子量计算——字符转数字
就是数字结束时,或者说是遇到下一个字母时。比如C12,可以先将字符转化为对应的数字(字符的ASCII码值-48),然后用1*10+2算出这个两位数字的大小,最后再将1。代码中再次用数组W[256]实现了查找表,这样可以通过将字母设为数组的下标,元素值设为原子量的值,从而快速获取字母对应的原子量。无数字时代表只有一个原子,因此可以设原子数n的默认值为1,当有数字时,计算数字并更新n。b. 计数时,如果n=-1,说明其前一位是个字母,此位数字是第一个数字,据此将n的初始值置为0,以便后续使用“连乘加法”计数。原创 2024-05-13 18:10:32 · 1366 阅读 · 0 评论 -
scanf留下的那一片云彩
注意,因为要返回自加后的值,此时就需要用++cnt,不能用cnt++(关于二者的区别参见“找不到北的i++”一文https://blog.csdn.net/jjmhx/article/details/136995419)。思路就是对输入串的字符进行遍历,如果遇到“O”就cnt++,如果遇到“X”就将cnt重置为0,然后每次将cnt加到sum中即可。老金想着秀一下“编技”,打一开始就想用getchar读取字符,这样就用不着数组了,没想到输出了意想不到的结果。②累加器sum,用于计算串的得分。原创 2024-05-11 18:12:02 · 1388 阅读 · 0 评论 -
程序找茬:统计字符个数问题
所以写不写都是一样,但不写的话一般会被认为对代码清晰性有影响(其实也影响不了啥清晰性,说白了就是大家都加,你不加你就是异类,让人看了心生违和感)。因此,if(s[i] == 1) 是错误的,应改为:if(s[i] == '1')。将计算字符串长度的函数strlen(s)写在循环中,会导致函数的重复调用,即每进行一次循环条件判断,都要重新计算字符串s的长度,显然这样会造成效率低下。我们在后续编程时应注意:如果函数的返回值是确定的,不要将其放在循环中,而应预先将其值存入变量。不过即便不影响运行,还是加上为好。原创 2024-05-10 17:29:05 · 557 阅读 · 0 评论 -
使用数组的必要条件
每输入一个数后,只能计算出当前输入所有数的平均值,而公式中的平均值是输入完成后所有数的平均值,所以“数据值-平均值”的值与以后输入的数有关,无法在每输入一个数更新此值,因此需要数组。假设输入只能读一遍。每输入一个数,只需要将其与max、smax比较即可算出新的max、smax,与以前输入的数无关,所以可以不用数组。可以在每次循环时更新4个变量的值:最大值、最小值、数的和、数的个数,这些值都只与原值和最近一次输入的数有关,所以可不用数组。输入数的个数只与原个数和最近一次输入的数有关,因此可以不用数组。原创 2024-05-09 18:00:58 · 470 阅读 · 0 评论 -
截取字符串的3种方法
注:格式化说明符%.*s表示输出*个字符,*的值由后面的变量n指定,这样表示就可以输出不固定的字符个数。完整形式为%m.ns,表示打印字符宽度为m,字符个数为n,如printf("%3.1s\n",s)会输出两个空格1个H。如果我们从大量的名人名言中随机截取片段,然后将它们重新组合成全新的句子,在有人工智能算法的加持下,就可能产生一些非常好玩的句子。也就是说,当n<m时,前面补空格,当n>m时,会正常输出n个字符(不会被截断)。:指向目标字符串的指针,即你要将源字符串复制到的位置。一、截取字符串的实现。原创 2024-05-06 21:41:01 · 12875 阅读 · 0 评论 -
环状串的字典序
只不过本题只是找出最小字典序,是排序的简化版,其算法本质上就像"求n个元素中的最小值"一样,只要拿其中1个与其它每个元素进行比较,一直取其中的最小值即可。环状串的核心词是“串”,本质上还是字符串,只不过是环形的,因此比较的对象是字符串。一般地,对于两个字符串,从第一个字符开始比较,当某一个位置的字符不同时,该位置字符较小的串,字典序较小(例如,abc比bcd小);老金想到的方法是先拿最小的字符A与串中的每一位比较,如果找到相等的就说明是最小字母,如果没找到就再依次拿C、G、T继续找。原创 2024-04-29 17:25:53 · 890 阅读 · 0 评论 -
“猜数字”问题的巧转换
从样例中能看出统计A时是不去重的,但看不出统计B时是不是去重的,从代码中能看出是不去重的。对于每个数字(1~9),设其在答案序列中出现的次数为c1,在猜测序列中出现的次数为c2,则min(c1,c2)就是总配成的对数。这个问题如果这样描述就简明多了:对猜测序列与答案序列相同的数字进行配对,位置相同的优先配对,统计配成的对数。或者这个问题也可以转化为连线问题,猜测序列与答案序列相同的数字进行连线,位置相同的优先连线,每个数字只能连一次线,A指连成的竖线数,B指连成的斜线数。②找到的数不能是已配过对的数。原创 2024-04-24 17:30:13 · 682 阅读 · 0 评论 -
判断回文串和镜像串:巧妙利用ASCII码的连续性
字符长度len分奇数、偶数两种情况,奇数可表示为len=2n+1,偶数可表示为len=2n,它们要判断到的位数分别为n+1、n,用(len+1)/2一个表达式就正好可以求出正确的判断位数,而不用预先判断字符是奇数个还是偶数个。首先,它是一个数组,其次,数组中的元素都是指针,最后,这些指针指向的都是字符。2.本代码的一个巧妙用法是,利用了“连续字母、数字的ASCII码值也是连续的”这一特点,直接实现了字符与下标的对应关系,从而提高了查找效率(避免了使用循环查找字符位置,详见后面老金的代码)。原创 2024-04-19 20:15:23 · 1507 阅读 · 0 评论 -
利用常量数组解码的方法
该函数定义在 <string.h> 头文件中,strchr(s, c)的功能是在字符串s中查找字符c,如果找到,返回指向首次出现位置的指针。注意,它返回的是指向位置的指针,而不是位置的索引(数组下标)。1.读取函数的选择:如果每输入一个字符,都能通过某种规则直接求出要输出的字符(也就是说输出与输入的单个字符有关,与输入的单词、短语、句子无关),这种情况下用读取单个字符的函数getchar输入是理想的方法。严格来说,常量数组的元素均为常量,是不应被改变的,所以定义时应在类型名前加上const。原创 2024-04-18 17:19:27 · 745 阅读 · 0 评论 -
“蛇形填数”问题的三种解法
蛇形填数的三种解法,第一种简洁,第二种笨拙,第三种巧妙。原创 2024-04-14 22:06:33 · 1597 阅读 · 0 评论 -
数字排列的方法
9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。num[i]都赋值为1,再判断num[1]到num[9]的值,如果有值为0就说明该数字没有出现过。如果有数字出现次数大于1,必然有其他数字没出现,所以②与①是等价的。(2)数的避重:每生成一个数,都去与之前生成的所有数逐一比较是否相等,相等就跳过,不相等就再生成下一个数。就像之前说的,任一数字的出现次数不等于1,必然会导致有数字没出现。③分离成a、b、c、d、e、f、g、h、i,用于下一步判重。原创 2024-04-09 22:04:58 · 889 阅读 · 0 评论 -
动态输出n位小数——满满都是坑!
输入变量n,让你将一个数保留n位小数,看似简单的题目,却是深坑重重。原创 2024-04-08 18:46:31 · 1213 阅读 · 0 评论 -
“韩信点兵”问题的数学真经
有一部数学真经叫《孙子算经》,产生了一个定理叫“中国剩余定理”,也叫“孙子定理”原创 2024-04-06 16:38:56 · 2758 阅读 · 0 评论 -
不堪大用的pow
求x的y次幂的库函数pow(x,y),当x、y都是整数时,会产生计算误差吗?原创 2024-04-04 18:05:15 · 830 阅读 · 0 评论 -
“多组数据”题的注意事项,天杀的“鲁棒性”
在题目要求输入“多组数据”时,应该注意什么?对计算机术语“鲁棒性”的评论。原创 2024-04-03 17:04:33 · 1229 阅读 · 0 评论 -
“数字直角三角形”的循环简化
本题的关键是要求出换行的位置,也就是每行中最后一个要输出的数的x坐标,即每行j的最大值j_max。之所以我认为可以用一层循环,主要是因为输出的数的规律是一致的,都是递增1,只不过要在不同的位置输出换行符。当然,此时代码中就不能随便改n的值了,即不能直接用n—了,而要先把n的值赋给另一个变量m,让m--。②小循环:一个数一个数的输出,后一个数是前一个数加1,这是一种有规律重复作业,可以用循环。还有另外一个思路,就从输出的数中找出换行的位置,还是以n=5为例,假设输出的数为i。《“数字直角三角形”的循环简化》原创 2024-03-28 17:05:19 · 854 阅读 · 0 评论 -
算法的本质
⑤可行性(Effectiveness):算法中的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)。宋老师的装大象三步曲只是一种纯语文描述,因而不能视为算法,除非它具有数学特征(有数据、有运算),才能视为算法。但它是包含了数学特征的,所以是可以视为算法的。②有限长的操作序列:算法是一系列步骤或操作的集合,这些步骤或操作的数量是有限的,即算法不能是无限循环的。③规定性:算法的每一个步骤或操作都必须是明确、无歧义的,以便计算机或其他执行者能够准确执行。原创 2024-03-27 11:09:00 · 576 阅读 · 0 评论 -
阶乘的强悍溢出技能
本文讨论的阶乘的强悍溢出能力、求大数运算末n位的优化算法及程序运行时间的测试代码。原创 2024-03-21 17:23:53 · 1148 阅读 · 0 评论 -
整型溢出问题及解决之道
本文讨论了3n+1问题易出现的乘法溢出问题,并给出解决之道,同时指出书中标准答案存在的不足。原创 2024-03-17 15:42:12 · 1837 阅读 · 0 评论 -
double型最大正值和最小正值探秘
本文通过摸索研究出全网独一份的求double型浮点数最大正数值和最小正数值的方法原创 2024-03-13 17:55:54 · 2110 阅读 · 0 评论 -
输出int型最大值、最小值的小妙招
如何简单确定数据类型是否符合题目数据范围?如何用代码巧妙输出int型的最大值、最小值?本文给出官方的做法及3种个人研究出来的方法。原创 2024-03-11 21:34:01 · 1362 阅读 · 0 评论 -
鲜为人知的闰年判定大坑
本文细述闰年规则的由来、判定方法及题目本身的大坑,然后提出与本题有关的逻辑表达式的效率判定问题,并通过程序加以证实。原创 2024-03-10 16:02:03 · 1130 阅读 · 0 评论 -
寻找完全平方数——浮点数陷阱
这个4位数用aabb表示,前面讨论过,a的取值范围是1-9,b的取值范围是0-9。也就是a的取值范围是1-9,b的取值范围是0-9。这是正向思维,这个思路的难点在于,sqrt()函数的返回值是double类型,这种浮点数是有误差的。要判断一个浮点数是不是整数,只能用一个不太完美的办法:求这个浮点数与最接近它的值的整数的差,如果这个差小于一个很小的数,就认为它是整数。换一种思路,用逆向思维,就能避开浮点数误差,找到完美的算法:求出最接近sqrt(aabb)的整数,反过来判断它的平方是否等于aabb。原创 2024-03-09 21:32:46 · 1654 阅读 · 0 评论 -
三角形和直角三角形的构成条件及证明
本文详细讲解了三角形和直角三角形的构成条件,并给出相关定理的几何证明原创 2024-03-06 17:35:35 · 1479 阅读 · 0 评论 -
三整数排序问题的解题逻辑
本文介绍三整数排序的三种方法:穷举条件法、排列法、交换变量排序法。在排列法一节中详细讨论了else简化逻辑判断的功能,并实现了不依靠else的逻辑判断。原创 2024-03-05 17:15:34 · 1226 阅读 · 0 评论 -
三位数反转问题易被忽略的两大细节
整数反转问题有两个容易被忽略的问题:(1)-127是三位数吗?012呢?(2)数的最高位不能为0原创 2024-03-04 17:44:24 · 1128 阅读 · 0 评论 -
交换变量的三种方法
虽然第二、三种方法看起来很好(少用一个变量),但实际上很少使用,因为它的适用范围很窄:第二种只有定义了加减法的数据类型才能采用,第三种只适用于整型,所以掌握这样的技巧只为提高编程能力,不推荐将其用于变量交换。执行完b = a ^ b后:a= a0^b0,b=a ^ b=( a0^b0) ^b0=a0。执行完a = a ^ b后:a= a ^ b=( a0^b0) ^a0=b0,b=a0。你可能已经发现,这个表和上面的表很相以,只要把男改为1,女改为0,有改为1,无改为0。这个运算规则很简单,但却有大用处。原创 2024-02-29 21:36:15 · 1987 阅读 · 0 评论