Merge branch 'main' of github.com:chefyuan/algorithm-base

This commit is contained in:
chefyuan 2021-09-23 21:01:55 +08:00
commit b983af03f7
4 changed files with 113 additions and 80 deletions

View File

@ -1,12 +1,19 @@
### 背景
某中上 985 传统工科本硕本科期间只上过大学生程序设计和微机原理两门计算机相关的公共基础课研一开始准备转行恰好研一暑假因为疫情无法返校遂背着老师投递了华为中央软件院的暑期实习非应届投递暑期实习是有风险的华为对计算机基础要求比较低对学历背景较好的非科班同学比较友好研二暑假通过了百度字节阿里腾讯美团携程的后端开发岗实习去了阿里淘系实习秋招目前收获阿里字节拼多多美团网易意向书腾讯华为米哈游录用排序中在春秋招的面试基本没有挂过
### 个人心得
#### 基础知识
- **基础知识是非科班和科班区别很大的一部分**科班有一整套系统的计算机学科培养体系我在准备基础的时候是按照考研课程进行系统学习的考研的基础课程能让你很大程度地接近科班学生的基础推荐 b 站的王道考研课程可以二倍速快速过一遍配合讲义标注一些重点日后可以反复观看这些基础不仅能方便日后学习编程语言和扩展知识时的理解在秋招面试中也经常会涉及
- **这里重点提一下算法** 算法和数据结构课程中涉及的知识都是非常基础的一定要熟稔于心在这个基础上可以刷 leetcode 题来提升自己的能力通常刚开始刷会有一些曲折比如遇到的题经常不会然后一道题写大半天我一般遇到不会的题超过 10 分钟没思路就会看题解然后按题解的思路再尝试自己写出来如果实在写不出来就照着题解自己敲一遍仔细领会每一句代码的意图然后再做标记第二天或者过几天我会再尝试自己写一遍重复几遍就会了这样至少能保证你刷到过的题你都能掌握刷题顺序的话推荐按分类刷我个人用的大力出奇迹直接按题号顺序刷但是一开始刷的会有点吃力另外的话可以刷一刷每日一题和周赛春招前我大概刷了 600+的题周赛全国排名 3000+
- ![](https://img-blog.csdnimg.cn/6a51c04e6bd24367a4e0b40a2e4d9a4e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAQ2hpbmVzaXNjaGd1eQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
#### 编程语言
C++ C 语言其实很像上述算法与数据结构课程的或者说理工科学校应该都会有的程序设计类的基础课都会教一些 C 语言的基础在这些基础上看下列书应该就足够了下面的书我基本上都看过一遍或者挑章节看过受益匪浅当然语言还是要多用多写可以通过刷题和项目来反复巩固和记忆
##### 书籍推荐
- C++primier第五版比较厚但是很全面可以慢慢看
@ -15,8 +22,11 @@ C++和C语言其实很像。上述算法与数据结构课程的或者说理工
- Effective C++个人感觉书上的知识点有些陈旧
- Modern Effective C++ C++11 新特性
- C++并发编程实战学习并发的基础知识就够了书在实现上用的 C++11 多线程但在实际的开发中使用的大多是 posix 多线程
##### C++岗位的选择
C++的岗位相比与 java 会相对少一些的java 拥有更好的生态使得它在业务开发上可以更灵活和方便不过校招一般不会对语言做限制如果大家在秋招中想继续从事 c++相关的开发那可以留意一下以下 C++岗位可以去看看官网对应的 JD然后对自己感兴趣的岗位做针对性的查漏补缺
- 游戏服务端和客户端网易互娱和雷火米哈游腾讯 IEG
- 推荐和搜索引擎阿里和 pdd 两家 java 为主的大厂在这块用的都是 C++
- 机器人自动驾驶开发无人驾驶企业华为车 BU
@ -24,45 +34,67 @@ C++的岗位相比与java会相对少一些的。java拥有更好的生态使
- C++比较多的互联网企业腾讯和百度
#### 扩展知识
这个部分我就介绍以下自己看得一些视频和书给大家做参考
##### linux
linux 是后端开发工程师必知必会的操作系统而且要对底层原理有详细的了解
- 深入理解 Linux 内核可以结合操作系统课程对照着来看有些部分在实际实现上和操作系统课程所讲的有些出入
- UNIX 环境高级编程 堪称圣经的 APUE介绍的是 unix 系统的基本原理和系统调用可以说是必看觉得书太厚了看不下的推荐一个 B 站的[课程](https://b23.tv/YjZyNv)讲得非常好可以跳过前面数据结构的部分直接看后面的
- UNIX 网络编程介绍了 UNIX 网络方面的原理和调用方法是对 APUE 的扩充如果这本书看不下去的可以直接看下面这本
- Linux 多线程服务端编程:使用 muduo C++网络库介绍了如何使用 C++开发高性能服务器这本书个人认为写的非常好我也是照着这本书写了自己的服务器的项目
- man 手册可以直接在命令行查看系统调用的使用方法
##### 数据库
- 数据库基本原理B 站有很多类似的课程我看的是东南大学的数据库原理及应用
- Mysql 必知必会 mysql 的用法也可以去看 B 站狂神的视频
- MySQL 技术内幕 InnoDB 存储引擎这本书写得非常不错有很多面试常见的知识点
##### Nosql
- Redis 设计与实现介绍了 redis 的源码设计redis 有很多设计非常巧妙的数据结构以及它在时间和空间上的高性能是怎么做的总之里面有很多让人印象深刻的点另外 redis 本身是用 c 语言写的所以感兴趣的话还可以直接去看源码
- b 站狂神讲 redis 使用讲的也挺好的
##### GCC+GDB
这部分都是 C++开发和调试的辅助工具有些面试比较喜欢问这个b 站也有类似视频都大同小异我这部分准备地也不好
- 常见编译选项
- GDB 原理
- GDB 常用命令
- 线上进程如何调试
##### 设计模式
- 常见的设计模式用途和优缺点
- b 站上有设计模式的课程我看的是[李建忠的课程](https://b23.tv/OyZBky)感觉讲得挺好的
##### 分布式系统设计
- 这部分知道 CAP/BASE 是啥应该就够了我看了一遍[这个](https://b23.tv/OyZBky)感觉和没看一样哈哈
##### docker
这部分的话只是自己感兴趣所以看的面试一般不会问
- b 站狂神的 docker 教程教你如何使用 docker
- 自己动手写 docker教你如何实现一个 docker以及 docker 底层的原理docker 是用 go 写的还可以顺带学一下 go照着敲一遍最后写出来还是蛮有成就感的
### 关于项目
C++一般都是用来造轮子所以在项目上大多都是偏底层的一些工具 java 选手对比起来在面试中会吃亏一些java 选手对高并发实际的业务场景中的问题和解决方法会有更深刻的认识下面举一些常见的项目
- **网络库/web 服务器**基本 C++的人手一个牛客也有卖类似的课程我也是参考 muduo 写的这个的话最好测一测 QPS 来体现那能达到的效果
- **数据库**写一个简易数据库这个部分可以看 MIT 的数据库课程里面的作业就是写一个数据库除此之外前面提到 redis 就是用 C 写的所以也可以用 C++写一个类似的简易版非关系型数据库
- **tinySTL**实现 STL 常用的容器和函数能够对底层数据结构有更清晰的认识
- **rp**crpc 是分布式系统中最重要的一环可以参考 Dubbo grpc 实现一个简易 RPC
- **flamingo**如果时间充裕的话推荐这个写一个类似 QQ 的软件github 上搜一下就有感觉比较牛逼而且资料和教程都很全
### 关于笔试
- 笔试通常都是**ACM 模式需要自己处理输入和输出** C++其实不太友好
- 输入的处理**未给定行数的情况**不知道行数可以用
@ -72,6 +104,7 @@ C++一般都是用来造轮子,所以在项目上大多都是偏底层的一
...
}//可以读到EOF
```
- **万能头文件**
```cpp
@ -82,11 +115,13 @@ C++一般都是用来造轮子,所以在项目上大多都是偏底层的一
- **学点 python**前面提到笔试对 C++其实不太友好比如笔试经常会用到字符分割字符串和数字转换C++可能要写 for 分割 atoi 或者 to_string 做转换 python 就会很方便再比如一些大数相加 C++只能用字符串或者链表来做加法python 就不用考虑溢出
- **选择合适的数据结构**比如之前的笔试题如果按题目的意图可能你要建立链表节点的结构然后针对输入去解析数字构建链表写翻转链表的函数再遍历链表输出但实际上这题只需要用字符串就可以对整个输入的字符串做 reverse再针对每一个数进行一次 reverse 就可以了
- **取巧**对于一些输出 true/false 或者数字的题实在写不出来随便打印一个答案可能就能拿几十分
```cpp
//翻转链表
//输入1,23,456,78
//输出78,456,23,1
```
- **其他一些辅助手段**
一些 ACM 选手喜欢加一些这样的操作提高码字速度和 IO 速度但个人感觉对于一般的笔试而言提升效果有限
@ -118,11 +153,14 @@ int main() {
```
### 关于面试
- **面经非常重要**面试中一半的问题都可以在牛客面经中找到因此可以找牛客上相关高质量的面经自己做整理然后过一遍
- 面试一般分为**基础知识****项目经历**两部分如果项目经历比较少就会着重问基础如果面试官对项目经历感兴趣可能全部都会问项目
- 项目上每一个点都要问自己**除了这样做还能怎么做你为什么选择这样做这样做的优点是什么以及这样做的底层是怎么实现的**比如我做的网络库最常见的问题selectpollepoll 优缺点选择的原因底层原理当你回答完之后再往下挖可能就会问 epoll 为什么用红黑树红黑树的底层原理和优缺点知识点要学会发散比如问完红黑树面试官可能会问你其他的树和数据结构比如 avl 树和红黑树的区别红黑树和快表的区别再发散问可能问 redis 为什么用快表不用红黑树总之在准备面试时也要**学会发散地思考**
- 很多时候面试官可能不了解 C++或者说投递的岗位不是用的 C++所以面试官不会问很多 C++的知识而是会问一些操作系统或者网络或者数据库等通用的知识因此这些**通用的基础知识一定要扎实**否则怎么能比得过那些语言对口的竞争者呢
- **掌握主动权**面试官的问题很多都是从你的角度来问的比如你的简历提到了 xxx那么你讲一下 xxx 再比如你刚刚回答里面提到了 xxx那么你讲一下 xxx所以自己是能够掌握一些面试中的主动权的因此自己掌握的知识点和看过的书都可以在简历上有所体现在简历中的每一个点都足够熟悉不熟悉的不放上去然后在回答问题中也要尽量回答自己熟悉的点对于不熟悉的点可以快速带过对熟悉的点可以适当展开
- 面试过程中要**适当反问面试官了解面试官提问的意图**可也以让他给你做适当的提示比如一个很泛的问题可能你觉得有好几个方面所以要了解面试官想让你深入哪个方面
### 总结
- 以上是个人的一点心得仅供参考不一定适合所有人因为自己导师比较放养给了我很多空闲的时间可以去学习自己感兴趣的东西也真的非常感谢我的导师希望能让我顺利毕业哈哈哈后续我也会整理一些面经希望能帮助到大家

View File

@ -65,8 +65,6 @@
![](https://img-blog.csdnimg.cn/a3bc62b23f994897a01d2f3a55b7463a.png)
第二步看面经八股
你刚才还说不能只看八股这刚调研完经典书籍就开始看八股了这不是自己打自己脸吗先别骂先别骂听我接着往下说
@ -471,6 +469,3 @@ HR 面基本就是唠嗑局,还挺有意思的。
另外再送给大家一句话相信自己你是一个不可多得的人才他们在面试你你同样也在面试他们最后能不能入职就看彼此是否有缘
好啦就唠到这啦拜了个拜我是厨子一位普通的球友希望大家在秋招中都能够拿到自己满意的 offer