常见基础错误

手(shou)误(jian)

  • 出错特征:程序执行流程出乎意料,结果不正确。
  • 出错样例:
for (int i = 0; i < n; i++) {
  if (i = n) printf("%d\n", i);
  else printf("%d ", i);
}
memset(a,0,sizeof(0))
for(int i = 0,i < n; i++){
  for(int j= 0; j < m; i++)
}
  • 治疗方法:剁手。多剁两次就记住了。

眼瞎系列

  • 出错特征:大小写字母傻傻分不清楚,该注释不注释,不该注释注释
  • 出错样例:
puts("yes"); // YES / Yes
#ifdef AC
    freopen("data.txt"."r",stdin);
#endif
//网络赛队友把我的代码copy下来debug,然后本地并没有设置编译参数,于是跑不出结果
//2.0:然后把#ifdef删掉:
freopen("data.txt"."r",stdin);
//本地测试没问题,交上去WA
  • 治疗方法:戳眼。多戳两次就记住了。

缩代码

  • 出错特征:为了缩行或者简化代码暂(S)时(B)的忽略了语法导致WA
  • 出错样例:
if(x==0){
    if(y==0)f1();
}
else f2();
//为了缩代码,改成下面这样:
if(x==0)
    if(y==0)f1();
else f2();
if(x%2==0) ...;
//同上
if(x&1==0) ...;
  • 治疗方法:让队友揍你。多揍几次就记住了。

浮点数

  • 出错特征:忽略了浮点数的精度误差问题导致WA或者TLE
  • 出错样例:
double a = 1/3*3;
double b = 1;
if (a == b) {
  printf("Yes");
}
double l=1.0,r=100.0;
while(l<=r){
    double mid=(l+r)>>1;
    if(ok(mid))l=mid;
    else r=mid;
}
  • 治疗方法:使用eps
  • 注意点:eps到底取多少? 一般在1e-5到1e-8之间。有些题目卡eps。

初始化

  • 出错特征:WA
  • 出错样例:比如每次使用vis之前没有清false之类

  • 治疗方案

    • 每个变量定义的同时就初始化。

    • 提交代码之前,检查所有定义的变量是否已经初始化。

数组大小

  • 出错特征:差别不大的会WA或TE。差别大的会RE。
  • 出错样例:眼花手抖导致的数组少个0。,“树”类问题数组只开了n
  • 治疗方案:数组开的足够大。

复制代码

  • 出错特征:复制一段代码然后粘贴再修改的方式编程。常常出现没修改干净的问题。常出现在搜索题或输出图形的题。
  • 出错样例:
void dfs1(int i){ xxxxx dfs1(x);}
//很好,我们复制粘贴一下,改一下函数名
void dfs2(int i){ xxxxx dfs1(x);}
//瓜皮代码都能过样例 千万不能相信样例!
  • 治疗方案:
    • 不要复制代码。把能重用的地方封装成函数然后再用(往往比较费时间)
    • 采用复制代码方式。修改后然后检查3遍,当WA的时候,重点检查此处。优先重写此处。(即将复制的代码列为高危代码)

写在最后

如果各位刷题时出现闹鬼代码,欢迎编辑在此,以供后人抓鬼。

https://www.zhihu.com/question/64013739

results matching ""

    No results matching ""