写代码时经常出错的点(持续更新)

  • 考虑数据范围不能只看输入的范围和结果的范围,计算过程中的范围也一定要考虑,比如输入n个1e9,但是现在需要求前缀和,那么多个1e9相加一定会爆int,所以就要开long long。

  • __int64,long long,int型之间的相加不能直接进行,只能同种类型相加。
    比如__int64 j和int i。i是不能和j进行加和操作的!

  • 除了返回值是void型的函数以外,其他所有的函数都需要明确写出返回值是什么,如果出现函数返回值不为void但是没有写任何return的情况的话会TLE!

  • 写两层及以上for循环时,一定要检查是否把内层循环写成 i ++了。

  • 当函数调用的参数为结构体类型时,确定是否将结构体里需要初始化的值都初始化了,比如步数是否初始化为0。

  • 计算某个数乘法或者次幂的时候,要注意数据有可能在运算的过程中就已经爆精度了,所以需要在一开始就将这个数的精度定义大一点。

    • 例如:要计算i * i * i (0 ≤ i ≤ 10000)的值时候,需要在for循环中就将i定义为long long, for(long long i = 0; i <= 10000; i ++) ;
  • 闰年的判断条件:if((year% 4 == 0 && year % 100) || year % 400 == 0) 是闰年前一种可以用2004来记(普通年份可以被4整除且不能被100整除),后一种可以用2000来记(世纪年份可以被400整除的才是闰年)。

  • 在处理两个日期之间有多少天的问题,可以先预处理每年有多少天,记录前缀和,然后再单独处理月和日。

  • 写 for 循环的时候,记得让i1开始,习惯写 ++ i

  • short的范围为 -2^15 ~ 2^15-1, int 的范围为-2^31 ~ 2^31-1, long long的范围为-2^63 ~ 2^63-1, __int128的范围为 -2^127 ~ 2^127-1。需要注意的是,无符号数取不到负数,如unsigned long long 的范围为0 ~ 2^64 - 1

  • 若要使用 map<node, int> 的时候需要先将结构体里的数据进行重载,谁大谁小无所谓。

  • 建图时使用链式前向星别忘了将h数组初始化为-1 。

  • 对于无向图,一定要记得将与边有关的数组大小都开成边上限的2倍!!!

  • lower_bound和upper_bound只能对上升序列使用,如果要想找到一个降序序列中,第一个小于a[i]的的值的话,需要把比较器改成 “ > ” “>” >,即lower_bound(a + 1, a + 1 + n, num, greater< int >());

  • vector的头插复杂度很高,尽量不要用,需要的话可以使用deque,头插操作为push_front, 尾插操作为push_back。

  • STL list的用法,链表很好使点这里

  • map的复杂度稳定O(logn),而unordered_map的复杂度在最坏情况下会被卡成O(n),所以能用map就不要用unordered_map!!!—— 详细说明(转)

  • 如果想要求 n ! / x ( x ≤ n ) n!/x(x \leq n) n!/xxn的话,不能先求出 n ! n! n!再除 x x x,可以在求 n ! n! n!的过程当中,不乘上 x x x,例如求 100 ! / 2 100!/2 100!/2就是从3开始累乘到100.

  • 如果在输入一个整数n之后,需要输入n行字符串的话,需要在输入n之后,getline(cin, str), str = “\n”。

  • 如果需要用map或者set去映射一个结构体,那么需要先在结构体内部写重载函数,需要重载每一个结构体内部的元素!

  • string的find函数如果找不到能匹配上的串,会返回string::npos,而不是0!!

  • 一个数d若可以整除k个数,那么d一定是这k个数的gcd的约数。

  • 如果遇到答案所求是一个序列,且需要在有多个长度相同的序列时,找到字典序最小的序列,可以用这种方法(vector):

bool cmp(vector<int> a, vector<int> b) {
        for(int i = 0; i < a.size(); ++ i) {
            if(a[i] != b[i]) {
                return a[i] < b[i];
            }
        }
        return a < b;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值