算法刷题经验总结

1、需使用函数时,有有返回值函数和无返回值函数两种类型。

对于有返回值函数,直接返回需要的值即可。

对于无返回值函数,往往是想简化main函数,这样如果函数中的变量已经被命名为全局变量,无需传递参数;如果仅仅是局部变量,就会遇到参数的传递问题。此时没有返回值,函数中对变量做出的改变无法同步到main函数中。这时就需要在实参和形参之间用地址连接,将改变的地方变成地址,即可真正实现同步效果。

例:交换两个数。参考博文:click here。与此同时,尽量使用引用传递。

2、尽量不要用scanf输入字符%c,会有各种各样的坑等着你,尽量用cin和getline代替。

3、用getline之前若有scanf,必须用getchar吸走之前的空格。

4、dev编译器在main内部无法开出1000000的数组,若必须要开的话将这个数组定义成全局变量。

5、数组题目允许的话尽量开大些,在时间有限的情况下可以降低bug出现的频率。

6、for循环的条件中尽量不要出现四则运算,将条件写在外面,否则会报莫名其妙的错。

7、有时候超时的原因是因为数据类型写错了,比如hdu3999

8、如果结构体倾向于作为存储功能,适宜用参数初始化表法初始化;

如果结构体倾向于对其直接操作,适宜于用结构体数组直接初始化。

9、搜索相关:

(1)、一般来说,深搜因为只能返回一个值所以返回的都是布尔变量,表示能否搜到,也就是处理解是否存在的问题。这样的话,如果想输出结果,就需要在递归底层输出。

(2)、而广搜因为不需要判断是否有解所以可以返回其他类型,用结构体处理较好。

(3)、dfs分为输出类和判断类,输出类由于要输出所有解,故需要遍历所有方向。判断类通常只有一个解,故当前方向如果可行返回即可。

10、八皇后相关:

(1)、如果当前元素的正上方,主对角线,副对角线方向都没有皇后,则可以放。
(2)、正对角线条数(9),副对角线条数(9)。
(3)、列数组,正对角线数组,副对角线数组。
(4)、因为每一行只能放一个元素,所以每遍历一次如果他可以放(即对应列和两个对角线上都没皇后)就标记一个,代表这个元素放置后他的列以及对角线都被占用,如此不断递归即得答案。

11、编译器问题:

(1)、关于输入,float用%f,double用%lf;而输出时,无论是float还是double,都用%f。否则G++过不了C++能过。

(2)、hdu中G++比C++要慢,所以若G++超时可以换成C++。

12、涉及字符或字符串的输入,果断用cin,用scanf的话会很恶心。

13、数组下标为字符,存入的是字符的ascii码,所以要把数组开到ascii码那么大。既然下标既可以为字符也可以为数字,那么这个字符的ascii码和数字是等效的,最后数组得到的值是后赋予的值。

比如对于一个int数组arr[105],若先赋值arr[68] = 1,再赋值arr['D'] = 2,最后得到的是arr[68]和arr['D']都是2,可见后者覆盖了前者。反之同理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值