暂时刷完leetcode的一点小体会
两年前,在实习生笔试的时候,笔试百度,对试卷上很多问题感到不知所云,毫无悬念的挂了
读研两年,今年代笔百度,发现算法题都见过,或者有思路,但一时之间居然都想不到很好的解法,而且很少手写思路,手写代码,有点仓皇失措;概念题却是很难答好,大多我都知道,但却难以描述清楚;最后一题大题,是设计分布式缓存系统,需要考虑负载均衡以及增删设备,我知识面比较窄,居然不知有一致性哈希,于是又跪了
说起来真是被百度虐了几遍了,除了百度的所有笔试题,我都能得到相对较高的分数,比如淘宝、腾讯、微策略等公司,可能题目风格比较克制我,不擅长回答这样几个简答+几个算法+一个系统设计的题。
痛定思痛,虽然我明年找工作,若以这样的状态和水平去笔试,面试,难以有什么好结果。
从笔试回来之后怒刷leetcode,约摸一个月有余,今天终于刷完142题(最后一题word ladder2是看答案copy的),纪念一下,并总结下这段时间狂刷题的感觉:
- 从做上面的题,我发现我更擅长一些数学技巧不高的程序题,习惯靠直觉立马书写代码,而非严格推理之后,再书写代码
- 对于链表的题比较擅长,链表可以在纸上画画,关键要考虑的问题,就是链表指针在运算中会改变,如何保存需要保存的链表指针值是难点,除了那题拷贝具有random指针的链表题,其他链表题我都比较快速的AC掉
- 对于树的题,常见的方法有:BFS和递归(可以看作是DFS),整体来说,难度也不大,其中递归应该是最常用的,递归的方法需要注意的就是边界判定;当然另一个问题,就是很多情况下,会被要求写非递归的解法,比如说树的遍历,或者知先序中序构建树,这些问题我得好好研究
- 对于求解题的BFS和DFS得到了比较大的锻炼,之前一直感觉模糊的掌握了DFS和BFS这两种搜索方法,事实上,直到现在才算是掌握的比较不错,对于leetcode上面的很多题,如果不限时的话,我都能以DFS搞定(起码能有20题以上),BFS往往在求解最先到达或者最短时间的时候用到,用起来感觉还不错
- 对于DP还是不算很熟悉,除了LCS,LIS还有编辑距离这样的经典DP题,其他我都很少往DP想,为什么我总觉得DP有点难理解呢?
- 关于DP和BFS,DFS求解的选择问题:一般来说,需要记录解(由哪些组成)优先选择BFS和DFS,它们在运算的时候能够很好的保存中间结果;对于DP,适合求解最终结果是怎么的情况,比如求值(最长公共子序列),或者判断是否存在(bool),DP如果要输出最优路径的话,是个比较麻烦的问题,一般还需要设置一个观测DP在选择表中如何移动的数组,关于DP我要好好训练下。
- 对STL熟悉了很多,用过很多之前都没用过的容器,几乎都用遍了吧:set,map,hash_set(unordered_set),hash_map(unordered_map),multimap,multiset(?好像这个我没用过),vector,string,pair,stack,queue等等,以及algorithm的函数,比如sort, unique,这些STL提供的,真是极大的方便了生活,以前经常得自己写一些基本数据结构,然而,自己写的再好哪有STL的好用啊!
- 对于在电脑面前写一些简单的算法程序应该是没很大问题了,但接下来的问题是:1,手写我要跪,虽然现在用vim,但我思路经常很跳,经常想起来就在前面插入,纸上可没这条件;2,一些基本的算法还不够熟练,比如快排,堆排,归并,KMP,等等,要立马写出一个bug free并且efficient&&elegant的代码是件不容易的时,我以后得专门在github上面建一个repo好好练习,自己写给自己看
- leetcode上的大部分题都有不止一种解法,得好好看看其他人的解法,并且总结总结自己的解法
对做leetcode的总结大致如此了。
看了一些大公司的笔试面试题,尤其是笔试题,都特别广泛特别杂,要想在笔试拿高分,我还需要看很多很多书籍,一般数据结构题占试卷的分数也就30%的样子,如果其它题了解不够深的话,基本也难拿多高的分,所以一大波书在等待着我;另一方面,由于我是C/C++系,其实很多C++的高级机制都不知道,有些知道了由于不常用,后来也忘了,这个必须得好好总结。
时间不多了,得好好努力!!