精确编码的零零碎碎注意点

目录

检查变量是否有误!检查变量!检查变量!检查变量!

语法错误

数组范围

重构代码的维护范围问题

数据范围问题

初始化问题

逻辑错误

循环问题

其他

数据结构

线段树


检查变量是否有误!检查变量!检查变量!检查变量!

只记一些因细小问题而导致长时间调试的问题。

可预见本文一字一句都是痛苦罚坐的缩影QAQ。

语法错误

数组范围

1. 数组范围是否改大

2. 双向建边时N是否×2

3. 题目中出现偶数长序列等,是给定数据的n倍,数组记得乘n。

重构代码的维护范围问题

1. 单条语句改多条时要加大括号

if(j==mi[i].size()) found=true;
//    cout<<cnt<<endl;
ans=max(cnt,ans);
/*--------------------------*/
if(j==mi[i].size()) {
  found=true;
  ans=max(cnt,ans);
}

2. 注意if维护的范围。(对拍出来的错误,太草了)

if(cnt>=maxcnt) {
  maxcnt=cnt;
  val=arr[i-1];
  cnt=1;
}
/*cnt=1;*/

数据范围问题

1. 常数默认为int! 当n>31时1<<n会出现问题!1LL<<n。

ll l=1,r=(1/*LL*/<<n)-1;

2. popcountll等小问题

3. 精度问题:将浮点数转换为整数除去小数位时,使用(ll)(double+eps)。

初始化问题

4. STL报错,检查STL初始化和越界问题

/*ans=a*/
for(ll i=0;i<b.length();++i) {
  for(ll j=a.length()-1; j>i; --j) {
    t=ans;
    swap(t[i],t[j]);
    sort(t.begin()+i+1,t.end());
    if(t.compare(b)>0)
      ans=t;
    else break;
  }
}
cout<<ans<<endl;

逻辑错误

循环问题

检查步骤:

1. 循环变量、循环范围、循环条件

2. 循环之前的初始化,第1步还是第0步还是while到区间左端。

3. 循环之后的处理,第n-1步还是第n步还是第n+1步,开还是闭,区间收尾等。

问题:

1. 多重循环记得写上外重循环的条件

2. while别忘了增加加循环变量

//匹配字符串时
ll p=0;
ll cnt=0;
ll j;
for(j=0; j<mi[i].size(); j++) {
  while(p<nshu.size()&&nshu[p]!=mi[i][j]) ++p;
  if(p==nshu.size()) break;
  ++cnt;
  /*++p;*/
}

其他

1. goto只用来输出答案,其他情况别用!切记! 

2. 比较运算符的优先级竟然比位运算大!

算术运算>位移运算>比较运算>位运算>逻辑运算

(n&(1<<i))>0&&(m&(1<<i))==0
/*而不是n&(1<<i)>0&&m&(1<<i)==0*/
((l+r)>>1)+1
/*而不是(l+r)>>1+1*/

数据结构

线段树

1. 若异常退出,调试发现rt超限,请检查是否加上return语句。

2. 若无算法问题,检查输入区间是否相反。

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务