前言
相信很多同学都和我一样,在学完数据结构与算法的时候,知道自己学了什么算法,但是碰到实际题目的时候就算知道用什么算法解决,但是很难亲手用代码实现,这里就总结以下我的学习方法,希望能对大家有些参考。我的编程水平?大学前计算机零基础,Leetcode周赛首题签到,PAT乙级50分,刷过的应该知道我有多菜。因为我觉得刷题可能比书上的长篇原理更能加深理解,所以我是主要总结刷题这一块的学习方法。有什么不对的地方请指出,必定及时学习改正。
编程语言选择
既然是刷题,肯定要选一门语言。我这里列举一下几个热门的编程语言(来源:PTA各种语言程序样例):
以下样例程序可用于解决这道简单的题目:读入2个整数A和B,然后输出它们的和。
C语言:
#include <stdio.h>
int main()
{
int a, b;
while(scanf("%d %d",&a, &b) != EOF)
printf("%d\n", a + b);
return 0;
}
C++:
#include <iostream>
using namespace std;
int main()
{
int a, b;
while (cin >> a >> b)
cout << a+b << endl;
return 0;
}
Java:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int a = in.nextInt();
int b = in.nextInt();
System.out.println(a + b);
}
}
}
Python3:
while True:
raw = input()
if raw == '':
break
print(sum(map(int, raw.split())))
以上四门语言是最常见的几门语言,如果要刷题最好选择热门的编程语言,原因很简单,因为有题解;其次是有些在线测试平台是不支持冷门语言的;还有就是热门语言有它热门的道理,上手快,相关的学习资料多。
这里大概列出本人使用这四门语言刷题的一些对比:
编程语言 | 优点 | 缺点 |
---|---|---|
C语言 | 入门语言无需再学习语法,相关学习资料多 | 能调用的库少,需要自己底层实现一遍 |
C++ | 刷题最热门的语言,题解多,有STL库方便调用 | 面向对象部分学起来有点难(其实刷题很少用 |
Java | 市场需求大,对以后找工作帮助大 | 除去核心代码的部分有点长 |
Python3 | 一行至上,简洁高效,调库出奇效 | 因为语言的问题,遇到大数据可能会超时 |
总之,我觉得如果用一门单刷的,推荐C+(我自己命名的),简单说就是使用C++的库,但是不深入C++的一些语法,比如面向对象之类的。如果要灵活刷的,建议C++Python,原因是这两门语言差的相对大一些,互补性强。当然如果你像我时间多,并且有浓厚的兴趣,不妨可以尝试四门语言全都要,甚至全部语言。
刷题平台推荐
选完了语言就可以快乐刷题了,那么我们该去什么平台刷题呢?这里推荐几个我常用的刷题平台。
PTA(拼题A)←传送
适合初学者刷题,PAT考试的大部分题目都有,主要是教学用的,部分学校会用这个平台布置作业和考试,浙江大学等学校的MOOC会在这里开设练习题目集。公共题目集里有浙江大学教材的配套练习集和PAT配套练习题,在商店里还可以购买时光机进行模拟考试和一些校招题目。题目的难度不大,毕竟是主教学的。个人接触时间最早,也是最长的平台了。(每周能在上面做几小时的作业)
LeetCode(力扣)←传送
和别的平台不一样,LeetCode屏蔽了输入输出的处理,主要是写一个核心的函数,所以刷一道题的时间会相对短一点,适合碎片化时间刷题,而且题解相比别的平台会多一点,能看到不同的解法和不同的语言,比较灵活。当然,英语好的话,建议直接刷LeetCode的英文版,可以见到别的国家大佬的不同奇妙解法。
牛客网←传送
主要是一些求职题库,各大公司的一些模拟题目,有好多求职信息,如果有意向找实习或是毕业找工作的同学,可以去上面刷刷,有些面经也有总结。另外,牛客竞赛也是可以去练练手,虽然有点偏向竞赛的,但是简单题也是可以做做的。
洛谷←传送
有很多模板题目,适合我们在学完一个算法后上去及时实践。看上面的题解和评论感觉自己又年轻了。应该是偏向中小学大佬的竞赛练习平台?我感觉可能是这样的,界面相对简洁清新。
学校OJ平台
个人见的比较多的是POJ、ZOJ和HDU,这类学校OJ每道题旁边一般是不会设什么讨论区或者题解的。基本上是给本校选手打校内训练赛或者举办邀请赛用的。有些学校是不对外开放OJ平台的。如果学校有条件的话,可以像我一样在旁边边缘听听他们竞赛的题解,可以收获一些没有见过的巧妙解法。毕竟搞竞赛的思路什么的肯定比我这种只会刷刷简单题的不一样。
竞赛平台
著名的OJ平台还有什么CF之类的,有一定难度,如果有兴趣的话可以去尝试尝试。
另外还有些没提到的,可能是我还没有见到,总之要选择最合适自己的平台去刷题,最好不要专一的刷几个平台,针对训练。
刷题技巧总结
1.温故知新
可以把刷过的题目归类,比如什么知识点下面刷过了什么题目,比如这是PAT甲级的,参考知乎回答,方便回去查看。
同样,可以把错题整理成一个错题集,以后做题前回顾以下自己曾经的错误,可以防止重复踩坑。
2.熟能生巧
前人写好的库,不就是为了能方便写代码吗?有些可以直接一行代码解决的,为什么要自己再实现一遍?(一般考试时间短,建议记一些写好的函数,直接调用)这里举几个常用的,比如C++的STL,Python的collections等加强的数据结构库等可以缩减代码,用正则表达式库处理字符串。
3.以错改错
有时候代码通不过,会有返回错误信息和获得分数。编译错误可能是什么打错了。答案错误应该是逻辑有问题。运行超时基本是算法的问题了,也有可能是输入输出超时。格式错误检查一下输出的空格、换行之类的。
4.知难而退
有些题目自己做的时候,不管怎么做都做不出来,可以去看看别的大佬的题解,可能你在读题的时候就已经偏离了提意,看别人的题解也是一种学习。
5.知难而上
即使错了,也要多试几次,不要试过一次就去做别的题了。可以通过调试工具一步一步找出自己的错误,多错几次,以后遇到就能节省时间。
6.总结归纳
我不知道大佬们是不是都喜欢整理一套自己的模板,比如树、图、链表等有些自己固定的写法,个人觉得总结一套自己的学习方法也很重要。各种平台都会有什么刷题宝典、动画解算法的,能自己总结出一套刷题技巧是更好的。考虑每天刷题写个日志记录一下心情也是一段宝贵的回忆。
7.快乐分享
可以把自己刷题的题解放在博客等公开平台上,和别的同学交流题解,你会发现不管是大佬给出的绝妙解法,还是萌新问的一些神奇问题,都能有意外的收获。
学习资料总结
这里大概列一下我平常收集的资料。
书籍
1.算法竞赛入门经典(第2版)
书不难,非ACMer大部分看得懂,亲测。比算法导论这种入门书籍好理解一点。
2.算法笔记
玩转研究生复试上机考试和PAT甲乙级考试, 突破CCF的CSP认证或其他算法考试, 求职面试的基础算法,海量例题实战解析,简单说,很实用。
3.算法竞赛——入门到进阶
罗勇军老师的书,在CSDN也有老师的博客,可以去看看老师写的算法专栏→罗勇军←。虽然这本书的书名是算法竞赛,但是写的内容并不是很深,适合对算法有兴趣的同学看。有些算法确实平时编程用不到,但是能巧妙地解出题目也是很有成就感的。
怎么可能只有这么点,后期看了再更新。。
博客
我寻思着CSDN平台上推荐别的平台博客不是很好,我就找了点CSDN写题解不错的博主。
1.柳婼
通称柳神,主写PAT和蓝桥杯的题解,多用C++语言写题解,代码精简,看了以后会发出为什么代码能这么短的感叹。
2.RabbitMQ!!!
主写LeetCode和剑指Offer,多用Java语言写题解。
3.Alex_McAvoy
主写洛谷、POJ、HDU等平台题解,还有竞赛一些算法总结,多用 C++ 写题解,目前看到分类专栏看上去最完整的。
4.Brielleqqqqqqjie
主写PTA顶级、甲级和剑指Offer题解,多用 C++ 写题解。
5.浒鱼鱼
针对PTA甲级考试写题解,多用 C++ 写题解。看的人不多,最近发现的,个人觉得最近要考甲级的同学可以看看。
6.Michael阿明
新发现的大佬,主写LeetCode、剑指Offer等,多用 C++ 写题解,每次把自己的LeetCode周赛及排名附在上,虽然也不是前百分之一水平的巨佬,但是很真实。
7.葑鈊丶
最后推自己不过分吧。。只更了PTA-Python题库,占了我博客99%的流量,也没有完美的解析,但是喜欢用Python3刷题。
又发现新的大佬会继续补充的。
视频
这里主要推万能的学习平台bilibili了,如果问我慕课能看什么的话,我之前有写过一篇:【杂谈分享】找不到自己想学什么?中国大学MOOC计算机方向课程推荐√
1.大红豆小薏米
Python语言LeetCode题解,偏向具体题目的算法讲解。
2.塔罗塔罗兔
C++ 语言LeetCode题解,偏向直播,看题不如看小姐姐系列。
3.一俩三四五
C++ 语言LeetCode题解,偏向周赛的实况和讲解。
刚入坑,平时推荐刷到的就放上来了。搜了一圈好像没有专门刷PTA的UP,别的平台也很少,有发现新的就更上来。说不定下个就是我。
后记
这只是我的一些刷题的学习总结并没有涵盖所有语言,所有平台,主要是以考研和找工作为主的一些刷题,非ACMer向的,我也很敬佩各位大佬,没有能力参加ACM,甚至觉得会有些遗憾。日后发现新的,会补充上去,另外自己也会更新一些新的题解。 希望大家能找到属于自己的学习方式,最后希望大家刷题愉快!