大家好,这篇博客是我博客生涯的第一篇博客,所以想先和大家分享一下春招过程中的收获和感受。由于博主是新手,如有需要改进的地方或者不明白的地方,请在评论区留言,博主将在第一时间赶赴现场与君讨论和请教。谢谢大家!!!
下面将知识点做个总结:
数据结构
- 链表和数组的区别(内存上的分布、增删查的时间复杂度)
- 树的先根、中根、后根遍历(延伸出来波兰序列和逆波兰序列)
- 双链表的增删查
- 图的深度优先搜索(延伸出回溯法)和广度优先搜索(延伸出分支界限法)
- 掌握几颗树:AVL(平衡二叉树),BST(二叉排序树),红黑树,B树,B+树
- 排序一定要掌握:堆排、基排、快排、冒泡(时间复杂度、空间复杂度、应用场景)
算法
- 常用算法一定要有印象:
- 贪心算法(每次都取最优)
- 动态规划(笔试和面试经常出现,建议看下经典的背包问题)
- 递归算法(斐波列序列、快排、二叉树的遍历、求阶乘),递归一般不能达到最优解,但面试过程中用递归可以使代码更加简短。
- 分治(快排、归并都利用了分治思想)
- 分支界限法(对应广度优先算法)
- 回溯法(对应深度优先算法)
- 典型的算法案例:
- 存储10亿个INT型的QQ号,但给的内存只有1GB。(明显,一个int型占用4个字节,10亿个QQ号就需要4GB的存储空间,直接存储内存不足。)解决方法是利用哈希存储,使用位图(每个QQ号只用一位进行存储,这样一个int型32位就能存储32个QQ号了)
- 在1亿个数中找出前1000个大的数(用int存储),只分配4KB的存储空间。解决这种问题(找出前n个最大或者最小的数),一般使用堆排。前n个最大的数使用最小堆,前n个最小的数使用最大堆
- 找出第k大的数,利用快排(快排的思想就是每次找到一个数在整个序列中的具体位置)
- 大整数乘法,使用分治思想
- 字符串匹配(判断回文串、找出最长回文子串、找出最长回文子序列、判断字符串A是否为字符串B的字序列)
- KMP算法(找出字符串A在字符串B的位置,不存在返回-1)
- 必须会手写的算法
- 快速排序
- 折半查找
- 归并排序
- 链表的逆序
- 链表的生成、查找、删除、添加
- 要掌握写算法的工具,博主练习算法一般使用C++,原因是网上参考例程多,而且执行起来相对高效。
- 要掌握C++的STL库,里面包含了队列、集合、栈等各种数据结构的容器,使用STL可以快速便捷的进行排序、去重、删除、插入、修改、统计大小、逆序(分配的是动态的内存,不像C++的数组一样是固定的)。
- 字符串的常见操作,博主发现很多笔试题喜欢考察字符串相关的题目,所以对字符串的逆序、统计大小、遍历等要重点掌握。
- 这里推荐一本书和一款视频教程,牛客网左大神写的[程序员算法面试指南](https://book.douban.com/subject/26638586/)和哈工大男神郭炜老师的[中国mooc大学程序设计与算法](https://www.icourse163.org/co