刚学编程,一天就ac3道,有些慢,而且过程充满了坎坷(悲
下面本蒟蒻要记录自己debug的一些经历:
最常见:WA(wrong answer):
这种基本上是自己最初的构想想错了,解决步骤如下:
1.瞪眼法
观察题目给的数据,自己的输出与样例,发现差了1,很有可能是边界问题漏加了,或者边界设定的就有些问题,漏掉了某个点。
这种方法在数据相差过大不管用
2.调试法
把代码复制到vs2022上,按需求调试
技巧:按F9设置断点。还在为一行一行跑代码而烦恼吗?只要将鼠标放在你想停下来的那一行,左键,再按F9(我的机型要同时按fn与F9),这样你就跑完断点前面所有的代码,再把数据一股脑复制,后面再调试
F10看上去是一行一行跑代码,但会跳过函数的内部,这很黑箱,想进函数看看只能按F11
最后打开监视,这个在你按下F5或者F10或者F11后,再在调试选项中找到。自动监视还是手动输入想要监视的变量名看个人喜好,懒人就用自动监视吧,大部分情况够用
3.问大佬
学编程都是先有数学思路再码代码,数学方面想不出来是真没办法,要么问大佬,要么问ai,要么好好沉淀
segmentation fault:
这种基本上是小问题,要么是边界越界访问,要么是访问不到,还有可能是栈溢出了
1.仔细想边界
问问自己:是不是越界访问,是不是访问了某个东西但那个东西没通过某种判定而没有初始化
越界访问基本将边界-1再另行判断
有些时候用数组还要考虑empty的问题
2.代码优化
栈溢出:基本上是定义了过大的二维数组或者递归过深
二维数组看看能不能用vector<pair<int,int>>来代替
递归的话看看能不能改成用循环做的迭代
TLE(time limit exceeded):
这种错误要么秒改,要么推倒整个程序重做
秒改的是你可能在while循环中忘记加i++之类的东西,或者在某个判断语句中卡死了
举个二分的例子,我当时令循环的结束条件是l<=r,然后mid=l+(r-l)/2,通过二分算完,若mid>=target,r=mid,若mid<target,l=mid
于是,这就死了,因为当l与r差1的时候,mid一直是l,硬控计算机到天荒地老
另一种情况是我最不想遇到的,那就是写了一坨,思路不行,运行太慢
这种基本上在最初的设计上就有问题,可以尝试换种方法,贪心,dfs等哪个会试哪个
最后一种:compile error
这个没什么好说的,涉及太多,我见过同学将include写成inlcude的,还见过sort后面不会跟地址跟了数组元素的,见过vs2022用scanf_s结果复制到不支持scanf_s的平台上的,见过特定数据用scanf("(%d,%d)",&a,&b),结果同学把两个%d中间的逗号漏了的
这种基本上编译器都会报错,按它的改就是了,语法基础是咱必修的童子功