![](/style/images/good.png)
![](/style/images/bad.png)
互联网公司最常见的面试算法题有哪些?
source link: https://www.zhihu.com/question/24964987
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
互联网公司最常见的面试算法题有哪些?
112 个回答
这个问题,我应该是最有发言权的吧!首先,让我们回顾几个有意思的经典互联网公司的面试题目,热热身。
1. 给你一个长度为 n 的数组,其中只有一个数字出现了奇数次,其他均出现偶数次,问如何使用优秀的时空复杂度快速找到这个数字
2. 给你一个长度为 n 的数组,其中只有一个数字出现了大于等于 n/2 次,问如何使用优秀的时空复杂度快速找到这个数字。
3. 给你一个 n*m
的二维数组,每行元素保证递增,每列元素保证递增,试问如何使用优秀的时间复杂度找到某个数字(或者判断不存在)。
4. 给你两颗二叉搜索树,如何使用线性的时间复杂度,将它们合并成一颗二叉搜索树。
5. 假设有 100
层的高楼,给你两个完全一样的鸡蛋。请你设计一种方法,能够试出来从第几层楼开始往下扔鸡蛋,鸡蛋会碎。 当然,这个问题还有推广版本,有兴趣的同学可以思考一下。 假设有 n
层楼,给你 k
个完全一样的鸡蛋,请问最坏情况下,至少需要试验多少次才能知道从第几层楼开始往下扔鸡蛋,鸡蛋会碎。
接下来,再认真回答一下这个问题。先划重点:面试
和 算法题
。作为在电话 / 现场面试中短短不到一个小时时间内,提供给面试者白板编程解决的算法题目,它与笔试上机、编程竞赛中的题目在难度与形式上还是有一些不同的。
这里有一张互联网公司面试中经常考察的问题类型总结的思维导图,我们可以结合图片中的信息分析一下。
可以明确的一点是,面试算法题目在难度上(尤其是代码难度上)会略低一些,倾向于考察一些基础数据结构与算法,对于高级算法和奇技淫巧一般不作考察。
代码题主要考察编程语言的应用是否熟练,基础是否扎实,一般来会让面试者写出代码完成一些简单的需求或者使用递归实现某些功能,而数学题倾向于考察概率相关的问题。以上这两类问题,出现的频率不会很高,即使出现了也应该是面试中的简单部分,相信一定难不倒在座的各位。
算法与数据结构是面试考察的重中之重,也是大家日后刷题时需要着重训练的部分。简单的总结一下,大约有这些内容:
算法 - Algorithms
数据结构 - Data Structures
对于上面总结的这部分内容,力扣(LeetCode) 已经为大家准备好了相关专题,等待大家来练习啦。
算法部分,我们开设了 初级算法 - 帮助入门、中级算法 - 巩固训练 、 高级算法 - 提升进阶 三个不同的栏目,包含:数组、字符串、搜索、排序、动态规划、数学、图论等许多内容。大家可以针对自己当前的基础与能力,选择相对应的栏目进行练习。为了能够达到较好的效果,建议小伙伴将所有题目都练习 2~3 遍,吃透每一道题目哦。
数据结构部分,我们开设了一个 数据结构探索板块,其中包含:队列与栈、数组与字符串、链表、哈希表、二叉树等丰富的内容。每一个章节都包含文字讲解与生动的图片演示,同时配套相关题目。相信只要认真练习,一定能受益匪浅。
力扣将 Top Interview Questions
里比较新的题目按照类别进行了整理,以供大家按模块练习。
模拟
数组
链表
堆
栈
哈希 / Map
队列
树
线段树
排序
二分检索
滑动窗口
动态规划
图论
数学 & 位运算
字符串
前方干货预警
力扣君特别为大家总结了“高频算法面试题汇总”卡片,在力扣探索频就可以找到,希望对各位即将面试的程序员小伙伴有帮助。最后,祝各位刷题愉快,早日拿到属于自己的Dream Offer。
欢迎各位知友关注力扣官方微信公众号:「LeetCode力扣」,更多关于程序员面试、技术干货的内容等你来啃!
要面试,免费试听《如何在一个月内攻破算法面试》,先理清思路能帮你节省65%准备时间。
从程序员面试角度来说,经典的问题包括以下内容:
算法部分
二分搜索 Binary Search
分治 Divide Conquer
宽度优先搜索 Breadth First Search
深度优先搜索 Depth First Search
回溯法 Backtracking
双指针 Two Pointers
动态规划 Dynamic Programming
扫描线 Scan-line algorithm
快排 Quick Sort
数据结构部分
栈 Stack
队列 Queue
链表 Linked List
数组 Array
哈希表 Hash Table
二叉树 Binary Tree
堆 Heap
并查集 Union Find
字典树 Trie
根据历年校招的情况,我整理了校招的常考算法类型,以及对应的典型题目。
另附参考答案地址:LINTCODE / LEETCODE 参考答案查询
数学
比特位操作
动态规划
堆
二叉树
二分法
分治法
哈希表
矩阵
宽度优先搜索
链表
枚举法
排序
深度优先搜索
数组
贪心
线段树
栈
整数
字符串处理
看完这篇文章后,有两件小事,能帮助你快速提升自己哟:
1、免费试听《如何在一个月内攻破算法面试》,开课以来已经帮助数万人厘清算法学习的思路,硅谷求职必修,最后冲刺秋招!鼓励我创作更多优质内容。
2、点赞+关注九章算法,让更多人看到这篇文章,这也鼓励我继续分享!
很多时候,你即使提前复习了这些最常见的面试算法题,你依旧无法通过算法面试!
为什么?
- 你在提前准备复习的时候,在网上找了半天相应题目的分析文章,但你看了就是不懂。
- 你在面试的时候,卡壳了,一时间忘了怎么写代码了
怎么办?
我来助你一臂之力!!
文末提供 200 道 LeetCode 高频算法面试题!
为了避免知乎大佬觉得我吹逼,先贴一下自己的 GitHub 地址,目前 70,000 star,全球排名 51 名。
算法是一种技能,是可以通过科学合理的方式训练出来的能力。
在想刷题之前,得从心里认识到接受刷题很重要,才能坚持去刷题。
江湖有个传言:国内刷 LeetCode,最多够你吃 1 年老本;湾区刷 LeetCode ,够你吃 10 年老本了。
为什么湾区的刷题性价比这么高呢?
你想想,电面考 4 道题,一道题值 5 万!单位是 Dollar !
刷到就是赚到!!
想想是不是很刺激,有没有动力开始刷题了!可以提速刷题了!
就目前互联网的情况来说,无论是面国外大厂还是面国内大厂,如果想换工作都要去刷题,一面二面不丢你几道 Hard 题,都对不住你偷偷摸摸找个会议室假装开会实则面试的鸡贼。
同时,还得认识到一点,面试能力和你平时的工作能力其实差别挺大的。
有些人技术挺厉害的,但没有刷题,一面二面都过不了,而某些小镇刷题家,还真就靠刷题拿下了 Google、微软、脸书等大厂offer。
国内大厂也有这种趋势,比如字节,一大半都是面试题。
要不是他提前先看视频刷题,妥妥得凉凉。
所以,刷题很重要。
(PS:感谢大家耐心的阅读,算法是程序员的重中之重,必须攻克,大厂面试必考,顺便送一份阿里大佬刷Leetcode总结的算法笔记,如果你能吃透,那我相信80%的技术面试都会不在话下:
BAT大佬写的Leetcode刷题笔记,看完秒杀80%的算法题!
这本书的目录,非常经典:
刷题大概可以分为 4 个阶段。
1、纯小白,不知道怎么刷题,对很多概念都很陌生,各种数据结构和知识点几乎完全不懂,打开 LeetCode 第一题,满头问号。
有人相爱、有人夜里开车看海、有人 LeetCode 第一题都做不出来。
2、算法上基本已经入门,Easy 可以做出来,Medium 纠结半天也能有头绪,但基础不牢,比如字符转字符串还得 Google 一下。
3、刷了几百道题后,总结了自己的解题模板,参加周赛有时候甚至可以全部完成。
4、开始以 beat 100% 作为 AC 的目标了。
就目前的算法面试大环境来说,能达到第二阶段,中小公司可以应付过去了,到达第三阶段,字节、腾讯算法面试环节妥妥没问题了。
怎么样到达第三阶段?
给一下我的一些小建议吧。
1、如果目标是国内大厂,那么一定要刷足够的题,不需要把 LeetCode 上 2500 道算法题都刷完,但至少刷 200 道算法高频题,这些高频题我都写了题解同时也录制了视频,
在这个链接总结了:https://www.algomooc.com/1659.html
2、面试前一周以看题为主,因为刷题也刷不了几题,多看看自己总结或者别人总结的模板,比如回溯算法模板,掌握后,几十道回溯题都不在话下。
一些模板:
3、刷题过程需要注意难度要循序渐进,算法训练是一个系统工程,需要循序渐进,太过于急功近利,反而容易因做不出难题而产生挫败感,带来反效果。
如果你本身有基础,熟练度高,那你刷简单的 LeetCode 应该是几分钟一题,几分钟一题的,花不了你多少时间。
如果你刷简单都花费很长时间,说明熟练度不够,就更应该从简单开始,然后过度到中等,再过度到困难。
并且,目前国内大厂的算法考察,基本不会超过 LeetCode 中等难度,上限难度基本都是 LeetCode 中等题里面的中等难度,所以不要太去纠结难题怪题偏题。
把高频题掌握就行了:https://www.algomooc.com/1659.html
再退一步,如果你觉得 LeetCode 的题目太难,可以先从《剑指 Offer》上的算法题开始学起。
为了帮助大家更好的入门学习算法,经过半年的积累,我给大家卷了《剑指 Offer》系列的三十道题目,结合动画的形式录制了视频,相信能帮助你更好的刷题。
领取地址:
4、按算法分类来选题,比如一个时间段,只刷链表题,刷得差不多的时候,接下来再刷二叉树的题。
这样做有几个很明显的好处。
一、持续地刷同个类型的题目,可以不断地巩固和加深理解,可以总结出自己的思考路径或者解题模板。
比如链表题目,就会去思考虚拟头节点、双指针、快慢指针。
二、可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。
我一直认为读书是世界上性价比最高的成长方式,书很便宜但分量很重,是让我们摆脱平庸走向卓越的方式之一。
对于计算机专业的学生而言,读计算机经典书籍不光能让你快速提升知识和能力,更会让你在校招之际如虎添翼。
书籍下载:计算机必看经典书籍(含下载方式)
第一周,链表、栈、队列
9、栈的基础知识
16、队列的基础知识
19、设计循环双端队列( LeetCode 641 )
第二周,递归、排序、贪心
1、递归基础知识
2、冒泡排序基础知识
3、选择排序基础知识
4、插入排序基础知识
5、快速排序基础知识
6、计数排序基础知识
7、归并排序
8、桶排序(了解即可)
9、堆排序
10、基数排序(了解即可)
11、希尔排序(了解即可)
13、颜色分类( LeetCode 75 )(✨有作业)
15、计算右侧小于当前元素的个数 ( LeetCode 315)
18、盛最多水的容器 ( LeetCode 11)(✨有作业)
19、两数之和(LeetCode 1)(✨有作业)
20、二叉堆基础知识
23、用最少数量的箭引爆气球( LeetCode 452 )
25、跳跃游戏( LeetCode 55 )(✨有作业)
27、买卖股票的最佳时机 II( LeetCode 122 )
30、加油站( LeetCode 134 )
31、合并区间( LeetCode 56 )
第三周,搜索算法、回溯算法、位运算、二分查找
1、二分查找基础知识
4、在排序数组中查找元素的第一个和最后一个位置( LeetCode 34 )(✨有作业)
5、搜索旋转排序数组( LeetCode 33 )(✨有作业)
9、剑指 Offer 53 – II. 0~n-1中缺失的数字
10、剑指 Offer 53 – I. 在排序数组中查找数字 I
11、剑指 Offer 51. 数组中的逆序对
13、第一个错误的版本( LeetCode 278 )
16、位运算基础知识
19、比特位计数( LeetCode 338 )
20、位 1 的个数( LeetCode 191 )
21、只出现一次的数字 II( LeetCode 137 )
22、只出现一次的数字 III( LeetCode 260 )
23、最大单词长度乘积( LeetCode 318 )
24、汉明距离( LeetCode 461 )
25、回溯基础知识
26、岛屿数量( LeetCode 200 )(✨有作业)
27、N 皇后( LeetCode 51 )(✨有作业)
28、子集( LeetCode 78 )
29、组合总和 II( LeetCode 40 )
30、括号生成( LeetCode 22 )
32、接雨水 II( LeetCode 407 )
33、组合( LeetCode 77 )
34、组合总和 II( LeetCode 216 )
35、分割回文串( LeetCode 131 )
36、全排列( LeetCode 46 )
第四周,二叉树
1、二叉树基础知识
7、从前序与中序遍历序列构造二叉树( LeetCode 105 )
12、将有序数组转换为二叉搜索树( LeetCode 108 )
13、把二叉搜索树转换为累加树( LeetCode 538 )
14、删除二叉搜索树中的节点( LeetCode 450 )
15、二叉树的序列化与反序列化( LeetCode 297 )
24、二叉搜索树的最近公共祖先( LeetCode 235 )
25、二叉搜索树的最小绝对差( LeetCode 530 )
第五周,动态规划、背包问题
1、动态规划基础知识和解题步骤
3、斐波那契数( LeetCode 509 )
6、零钱兑换 II( LeetCode 518 )
10、买卖股票的最佳时机II( LeetCode 122 )
11、买卖股票的最佳时机III( LeetCode 123 )
12、买卖股票的最佳时机IV( LeetCode 188 )
14、买卖股票的最佳时机含手续费(LeetCode 714)
20、不同的二叉搜索树( LeetCode 96 )
21、地下城游戏( LeetCode 174 )
31、最长回文子串( LeetCode 5 )
31、01 背包问题
32、目标和( LeetCode 494 )
33、最后一块石头的重量 II( LeetCode 1049 )
第六周,剑指 Offer 系列
在大厂的面试中,频繁的出现《剑指 Offer》上面的原题。
众所周知,刷题有一个很重要的技巧就是按照标签来刷,在某个时间段内只刷相对应的题目,这种做法可以极大的提高刷题的速度,而且能带来更好的效果。
1、持续地刷同个类型的题目,可以不断地巩固和加深理解。
2、可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。
而关于《剑指 Offer》,发现一个宝藏网站,里面的每一道都是算法面试的高频类型,并且提供详细的分析、精美的配图、易于理解的动画操作、保姆级别的注释、手把手的视频讲解。
剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - III. 从上到下打印二叉树 III
https://blog.algomooc.com/055.html
https://blog.algomooc.com/0552.html
最后,再给大家送上点干货!
下面这是一个高赞回答合集,建议大家点赞&收藏,Mark住别丢了,大学期间绝对用得上。
1、怎么学好数据结构,看下面这个回答,已经获得了 21000+ 的赞和 50000+的收藏。
2、如何系统地学习算法,看下面这个回答,已经获得了 11000+ 的赞和 26000+的收藏。
3、新手该如何使用 GitHub,看下面这个回答,如果在大学期间就知道使用 GitHub ,那么能力远超同龄人。
4、想成为一名优秀的程序员,那么这些程序员平时都喜欢逛的论坛怎么说你也得收藏一些吧。
5、无论别人怎么说,我都是坚定不移的选择计算机专业。
6、如何系统地学习 C++ ,这个回答能帮你找到路线。
7、想要准备 Java 面试,那么这些面试题必须掌握。
赶紧点赞和收藏吧~
常考面试算法题类型总结
结合2017春招和秋招真题,以下几类算法题最常考,汇总了一下:
一、暴力枚举
二、动态规划
三、DFS/BFS
四、数学
五、模拟实现
六、贪心算法
七、字符串算法
练习题库推荐
推荐两个题库,面试算法题基本上都是从里面出的或者变形而来:
1、剑指Offer
算法视频推荐
互联网名企面经精选
因为每家公司的侧重点不同,所以他们面试时考的题目类型也不同。如果能提前知道每家公司考题的风格,临到自己上考场就会轻松很多。整理了一些前辈们的面试经验分享给大家:
阿里巴巴:
华为:
好未来:
网易:
京东:
腾讯:
百度:
美团:
更多名企笔试真题解析、面试经验交流、招聘信息内推,尽在牛客!
求职之前,先上牛客!快快下载拿offer!
更多面经汇总:
1、备战秋招,17年春招面经整理合集(170篇) - 知乎专栏
2、23家互联网名企的300多篇精华笔经面经,免费领取 - 知乎专栏
最后,祝大家都能拿到自己最想要的那份offer,加油~
我是CodeTop项目的发起人,我想是有资格回答这个问题的。
从去年7月到现在,我人工总结了上千篇牛客面经,统计出各大厂常考的算法题。
题目数据已在Github的LeetcodeTop仓库开源,目前已经12.7k star。
LeetcodeTop仓库用于汇总大厂常考的Leetcode题之所以要汇总大厂高频算法题,是因为Leetcode的题目真的太多了,现在已经有1800多道。
大家准备面试的时间都是有限的,可能就2~3个月。
对于应付面试而言,应该把精力用在刷高频题上,这样性价比会更高。
真的没必要花时间在那些不怎么考的题上
那怎么知道哪些题常考呢?
你可能会说Leetcode Hot 100
是的,我刚开始也刷的Hot 100
直到字节面试遇到了个「K 个一组翻转链表」
才发现Hot 100并不够。
事后翻了几篇面经,我才知道这道题其实是字节跳动的“网红题”
下表数据来自CodeTop字节跳动算法题高频榜,该题位列第3。
题目 | 考察次数 |
---|---|
3. 无重复字符的最长子串 | 92 |
206. 反转链表 | 75 |
25. K 个一组翻转链表 | 73 |
215. 数组中的第K个最大元素 | 73 |
146. LRU缓存机制 | 63 |
我意识到,要想弄清大厂到底爱考哪些算法题,需要多看面经。
于是,我开始看大量的牛客面经,把面经里涉及的算法题全都汇总下来,对应成一道道Leetcode题。
为了容易找到出题规律,我不仅把每篇面经的公司记下来了,而且还记录了面试的部门、岗位。
因为,面试某部门的某个岗位,面试官往往就是这个部门该岗位的工程师。
比如,投递的阿里巴巴-阿里云的后端,一般就是阿里云的后端工程师来面你。
因此,将公司-部门-岗位都记录下来,更容易发现高频题的规律!!
经过几天的努力,我将汇总出的第一版高频题发到牛客上,瞬间火爆,有1800余人收藏;在Github创建的大厂高频题仓库,仅一个月就涨到了2k star。
截止到今天,我汇总的面经早已过千。
为了更方便查询,我开发了CodeTop。网站完全免费!!!
在CodeTop上,不仅可以按公司、部门、岗位筛选,而且还可以按照题目难度、题型等条件筛选。
现在,也支持大家自主爆料题目。
目前的题库已包括字节跳动、微软、腾讯、美团、快手、阿里等公司的数据,覆盖100多个部门。
频度数据大多都是我人工整理面经而得,这真的是件很耗费精力的事
如果觉得还不错的话,帮我
点个赞吧我相信CodeTop一定对你有帮助。
![v2-21e65ae53395f01d4be4747658f7089c_720w.webp?source=1940ef5c](https://picx.zhimg.com/80/v2-21e65ae53395f01d4be4747658f7089c_720w.webp?source=1940ef5c)
校招+跳槽怎么也面过30+场,最常考到的绝对是二分法,碰到不下3次旋转数组,套路还越来越深,吓得我刷了不少相关题型:
除此之外就是递归以及常见的动态规划。
学高频题型只能应急,真正帮助到自己的还是有体系地进行学习(文末可下载笔记):
上述都是程序员面试的考点,想要彻底掌握的话,可以按深度优先遍历的方法循序渐进的实战,让自己把每个知识点彻底挖透记牢。推荐大家用Leetcode官方出品的免费教程 Leetbook,按照各个知识点循序渐进地罗列了算法题。
推荐的学习顺序:
Leetbook的好处是把算法归类为各个章节,而且大部分章节都是免费的。在入门的时候就不要刷那种高频面试题了,先把数据结构和算法的各个基础打好。每个 book 里都是先教学、再由易到难地实战,一个知识点大概有十几道题,刷完基本上就能掌握一些套路,到medium的水平了。
然后才是去看各种面经和高频题,给自己查漏补缺,并且要稍微记录一下,几行代码或者解题思路,方便自己快速复习。
这里再给大家分享一些资料,都是刷题福音:
下面是我总结的一些必刷算法(字母是难度),部分解法在文末的脑图中,可以直接下载。
栈
链表
并查集
树
二叉树
平衡二叉树
- 基本原理和操作
- 为什么有了BST和AVL还需要红黑树
完全二叉树
- 完全二叉树的插入
- 222. 完全二叉树的节点个数 M
哈希表
前缀和+哈希表
查找
二分查找
BFS
DFS
双指针
滑动窗口
排序
字典序
TopK问题
动态规划
模式匹配
- 单模式单匹配:KMP
- 多模式单匹配:Trie
- 多模式多匹配:AC自动机
大数据
- 蓄水池抽样法
当然,除了勤奋地刷题之外,一定要多学习大佬们的思路,掌握最优的解法。这里离不开一些开源笔记的帮助:
一位CMU硕士整理的101道经典题型,按体系归好类了,初学者可以先跟着走一遍(文末下载):
还有LeetCode Cookbook对1479道题都给了思路和解法、复杂度分析(文末下载):
上面的资料都帮大家整理好啦,记得点个赞再去下载呀~
作者:阿秀
计算机校招八股文网站:https://interviewguide.cn
作为一名刚刚结束秋招的21届老学长,在找工作前将剑指offer刷完三遍、LeetCode以76%+正确率刷完400+道题后,做足了准备后才去参加的秋招,还好最后成功拿到了字节跳动的研发岗Offer。
看看近些年来的算法考察趋势也能看出,真的是越来越卷了。
话说阿秀自己经历了2021届的互联网秋招,在面试的过程中,被问过各种各样的问题,但是大部分都是基础性的题,所以基本功很重要,也很关键。
所以在我以前通过校招上岸字节跳动后,将我自己的秋招找工作认真总结,并且开源在github上了
可以说我能够凭借双非的学历进入字节跳动全靠我自己总结的这份笔记,后来我将这份笔记制作成了PDF,并且同步到了自己的校招学习网站上,现在免费分享给学习学妹们!
自己以前的学习笔记包括操作系统、计算机网络、数据库(MySQL、Redis)、常见情景题、智力题以及计算机面试中需要注意的问题。
下面是我的校招学习笔记网站内容大纲
《阿秀的校招学习笔记》网站内容大纲不少学弟学妹们在这个网站的帮助下,顺利进入BAT、TMD,甚至去了字节跟阿秀一起做同事,都跑来找我报喜!
这是我的学习笔记网站:
不说了,进来学习!!!!
算法考察趋势
2017-2018逐渐开始出现动态规划(DP)和深度优先搜索(DFS),直到2020年,DP和DFS依旧是考察重点。
在我在三四十场笔试和面试中,我发现有几类型题考的次数特别多,而这些题目都是同一个类型的,那就是动态规划和深度优先搜索。
对于数组,可能会重点考察以下题目:
首先上一张数据结构与算法的技能树吧,这是全部的数据结构与算法的考点了(文末送你一份算法资料)。
下面是我自己总结的一些必刷算法题,大家可以针对性的去牛客网或者 LeetCode 进行练习。我在做算法练习的时候,学完C++ Primer前八章就开始去刷题了,我比较喜欢在实战中成长。
话说在我本科+研究生七八年的学习时间里,陆陆续续收集了很多的计算机专业书籍,还有一些刷题笔记、简历模板和视频资料等。现在大致整理了一下,居然有1000本之多,我都打包分享出来了。
地址1:https://github.com/forthespada/CS-Books(如果由于网络等因素不能访问,可以尝试地址2)
地址2:https://gitee.com/ForthEspada/CS-Books
链表
对于字符串,可能会重点考察以下题目:
对于动态规划,可能会重点考察以下题目:
对于贪心算法,可能会重点考察以下题目:
对于DFS(深度优先搜索遍历),可能会重点考察以下题目:
对于BFS(广度优先搜索遍历),可能会重点考察以下题目:
对于双指针,可能会重点考察以下题目:
话说我最近发现三位谷歌大神写算法刷题资料,支持Java、C++、Go三种语言,其中对于面试中考察较多的链表、树、动态规划、数组等知识点讲解的都很全!如果你算法能力比较弱,比如互联网大厂面试中手撕算法比较差的话,那要好好看看了。
你如果想进BAT、TMD、快手这样的一线大厂,那么这本书小抄你应该好好看看了。
最后再送上一些干货,下面是一个高赞回答合集,建议你点赞&收藏,千万要Mark住啊,丢了可能就找不到了,因为你大学学习计算机期间绝对用得上,其中有好几个都是收藏过万的回答。
记得收藏的时候帮学长 @阿秀 点个赞呀!!不要只收藏不点赞啊, (๑•̀ㅂ•́) ✧ 拒绝白嫖,人人有责!
如果有计算机学习、校招求职、考研、读研感兴趣的小伙伴也可以点击下方卡片关注下阿秀鸭
一直致力于分享计算机学习、校招相关、硬核技术等,让你们不再让我走过的弯路!
1、学习编程其实没你想的那么难,完整复盘我系统准备校招&自学的那一年,好好阅读下去,对你肯定有所帮助。
2、对于一些想要转行或者读研的朋友,下面两个回答肯定能帮到你!
3、如果你决定不了到底学习C++还是Java,不妨来看看这个回答!
4、建议多看经典书,而不是什么《七天教你学会Java》、《21天C++从入门到精通》系列,这类型的书完全是浪费时间,让你走歪路!
5、Linux C/C++ 方向自学的完整路线,很多人不知道学习完 C++ Primer 能做什么项目练手,这个回答不可错过!
6、如果你准备时间不多,就抓住重点,在最短的时间内搞定必要的数据结构和算法而去面试
7、我自己在学习计算机过程中看过的优质网课,这些精品课程你的大学四年绝对够用了。
楼主的问题比较笼统,所以要完全的回答不是很容易
本人在美国10年,FLAG公司,以及各大科技巨头面试也见过很多次,可以大概的分享下我的经验
首先需要明白的是:应届毕业生和在职跳槽,面试难度上,应届毕业生的难度,以及打分的要求,会略低于在职跳槽,原因很简单,应届毕业生经验不足,没有全职的工作经历。
至于湾区FLAG和各大公司巨头的面试流程,时间线,不是本问题的中心,如果需要的话,可以私信我。
首先,作为程序员,你必须知道Leetcode这个OJ,刷题题库,必备
题目分为easy, medium, hard等级,没有听说过的朋友可以先去看看。
现在讲讲面试的题目
Facebook,面试难度9分
考察的知识点很全面,Facebook的面试题目难度一般都在medium偏上一点,但为什么我打难度9分,因为Facebook的面试要求很高,简单的说,面试者必须在最快的时间内写出bug free的代码,一旦出现BUG,这轮面试基本就挂了。另外,FB比较强调最优解。比如,会先问你2sum,然后拓展到3sum,4sum。比如经典的动态规划,背包问题以及所有的follow up,都是比较经典的常考题目。
Linkedin,面试难度7分
Linkedin的面试难度适中,Leetcode上中等难度的题目居多,经典一点的,比如nested element iterator, sqrt, paint fence都是比较经典的题目。大概的难度都在这个范围之内
Amazon,面试难度6.5
整体而言,亚马逊在硅谷的四大巨头里的面试,技术难度是最低的,但是能够成功通过面试并没多很多。原因在于亚马逊很看重行为类问题(behaviral question)以及公司的文化配合(culture fit)。技术方面,经典一点的题目,比如最长回文串,二叉树层遍历,二叉树validate等等
Google,面试难度9.5
狗家的面试题目,在LEETCODE上算是medium偏难,以及一些hard的题目。但最难的点在于,谷歌有自己的题库,而且是不断跟新的,这个就无形中增大了面试难度。题目方面,谷歌考得很全面,线段树(segment tree),动态规划DP,以及图,是常出现的。
整体来说,面试算法题这是一个很大的话题,一段话很难概括清楚,上次本人做过一次湾区的公司面试准备的讲座,讲了接近4小时。如果有额外的问题,可以私信我。
希望对你有所帮助
广告一下,欢迎大家参加免费公开课
《美国大数据工程师面试攻略》——董飞,9月7日,上午10:30#############
我的面试高频题
- JOIN: nested join, hash join, sort-merge join
- Number: Fibonacci, prime,随机取文件某一行
- String: strstr, wordcount
- Tree: height, lca, balance tree
- Heap: 查找最大的k个数
- DP: 最大连续子串和
- array: find a key in rotated array, 去除重复字符
- linkedlist: 是否有环,插入结点,删除重复结点
- 递归回溯:变化很多,这方面需要大量练习
多线程,mutex/semaphore
java GC
C++ virtual, smart pointer
regex使用
数据库:知道btree, 索引
search engine: 倒排表,拉链,稀疏索引,空间向量模型,tf*idf,
large scale data: hash, consistent hash, bloom filter, bitmap, 外排序,
partition
分布式:CAP理论,gossip,Paxos, GFS设计思想
network: socket, tcp3次握手, asyschnoized io, epoll, select, 惊群
queue/stack实现
trie tree
四则运算求值
我感觉把我上面说的练熟,还是很大可能性遇到的,虽然不是很全面,但我觉得不应该
把太多时间花在难题上,充实知识体系,符合职位要求更重要。
标 题: 低频题小节
发信站: BBS 未名空间站 (Sun Mar 4 13:17:29 2012, 美东)
我在面试中,发现还是有时候很难去准备的,听起来也很怪,我就随便列一些我遇到的
低频题给大家看看,有个感觉。
1. python yield什么意思,generator,如何操作系统命令popen跟os.system区别
2. 问我API是叫什么,作用是如何把一个path 和文件连起来,path+name,我后来才明
白是说path里面有可能最后没/,path="/ab" , name = "ef"
3. java实现多线程的三种方式
4. java跟c++模板的区别
1. 图论:把一个有向图划分成几个区域,每个区域用一中颜色染色,强连通?
分布式理论
2 phase commit是啥
vector clock
一致性hash,分布式hash
数据如何备份,把mysql导入导出命令给写出来,load data...
信息处理:
如何消重,去除spam
1. reject sampling, 计算期望
linux内核
1. linux的原语是怎么实现的
2. 软练和硬连的区别
3. kill -9 9是什么意思,会不会有些进程永远杀不死
4. ls -l /dev
brw-r----- 1 root operator 14, 0 Feb 29 01:48 disk0
解释每个字符什么意思,14是什么
计算机原理
CPU L1, L2, L3 cache, memory 速度
磁盘读写速度
SSD跟Sata磁盘区别
所谓知己知彼,百战不殆,今天就和大家聊聊互联网公司那些最常见的面试算法题。
![动图封面](https://pica.zhimg.com/50/v2-680e1302d578d07237ca32ff7d962238_720w.jpg?source=1940ef5c)
清点面试算法题之前我们先要明确面试官考察的目的,比如有一道经典考题是“怎么用3升和5升的桶量出4升的水?”其实这道题的答案并不难,但是对于面试官,可以通过这道题考察的内容就比较丰富了。
一、概括一下面试算法的目的
1、基础知识储备量
考察知识储量是面试算法最基本的目的,但是直接考察算法基础已经很少出现在实际面试中了,需要快速筛选面试者的时候才会用到。
2、思考方向
有的算法可能有两个甚至多个答案,这时面试官就不是单纯的考察面试者的知识储备量了,通过面试者的答案可以看出面试者的思考方向,符合公司的日常工作需求才是“有缘人”。
3、解决问题能力
能不能解出答案是次要的,分析和解决问题的思路才是面试官考察的根本所在。
4、辅助能力
算法是整个计算机领域里最基础的学科,其余大部分的学科和技能都是在算法的基础上展开的,所以这类考察实则是考察面试者能否快速融入工作当中。
总的来说,算法题是综合考察面试者思维逻辑和基础知识的好办法。
![动图封面](https://picx.zhimg.com/50/v2-36c536fc6c75f5cc8ac73afb0964af29_720w.jpg?source=1940ef5c)
二、算法面试题的类型
虽然面试算法题层出不穷,但从算法的类型来看,互联网公司最常见的面试算法题分以下几种。
1、基础算法
基础算法主要有大数据查找、快排、哈希算法解决冲突等。以针对搜索来讲,可能设计一个数据库表内包含名字、课程、分数3列,求所有课程最低分不小于80分的名单,如果要求用SQL表达,就是对于基础知识点和基本功的考察。另外可能还会涉及一些计算机网络的TCP三次握手协议等基础的算法考察。
例如2017京东校招的排序题目:
对关键字{10,20,8,25,35,6,18,30,5,15,28}序列进行希尔排序,取增量d =5时,排序结果为( )
A. {6,18,8,5,15,10,20,30,25,35,28}
B. {10,18,8,5,15,6,20,30,25,35,28}
C. {10,20,8,5,15,6,18,30,25,35,28}
D. {10,20,30,5,8,6,15,18,25,28,35}
1) 用简单取巧的方式,标记原始关键字为abcdeabcdea,那么a对应的数字就是10,6,28,排序后就是6,10,28,所以答案就是A。
2) 当然也可以用代码去实现,更考验技术含量,就像下面的JAVA实现。
public class ShellSort {
public static void main(String [] args)
{
int[]a={49,38,65,97,76,13,27,49,78,34,12,64,1};
System.out.println("排序之前:");
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
//希尔排序
int d=a.length;
while(true){
for(int i=0;i<d;i++){
for(int j=i;j+d<a.length;j+=d){
int temp;
if(a[j]>a[j+d]){
temp=a[j];
a[j]=a[j+d];
a[j+d]=temp;
}
}
}
if(d==1){break;}
d--;
}
System.out.println();
System.out.println("排序之后:");
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
}
}
2、数据结构
基础数据结构更多的出现在应届生校招和笔试环节中,这类面试题涉及到链表、堆、栈、队列、图、二叉树等。
比如2018年科大讯飞的笔试题:
下面关于二叉排序树的说法错误的是( )
A. 在二叉排序树中,完全二叉树的查找效率最低
B. 对二叉排序树进行中序遍历,必定得到节点关键字的有序序列
C. 二叉排序树的平均查找长度是O(log2n)
D. 二叉排序树的查找效率与二叉树的树形有关
通过二叉排序树,可以发现完全二叉树的查找效率最高,故答案选A。
3、灵活解决问题的算法
灵活解决问题的算法在面试中占据了相当重要的地位,这类题不告诉面试者具体需要用什么算法,而是虚构一个问题,让你找出具体的解决方案。
比如腾讯优图的面试题:
给你8颗小石头和一架天平,其中7颗石头重量是一样的,另外一个比这7颗略重。请问在最坏的情况下,最少要称量几次,才能把这颗最终的石头找出来?
最简单的方法是挑出两颗,把剩下6颗分成两份称重,如果一样重,则再称一下挑出的那两颗即可,如果不一样重,排除较轻的三颗,剩下3颗挑一颗出来,称其余两颗。如果一样重,则挑出的那颗便是,如果不一样重,重的那颗便是。所以答案是两次。
淘宝的面试题:
假设淘宝一天有5亿条成交数据,求出销量最高的100个商品并给出算法的时间复杂度。
看似是考察查找算法的,但是因为询问了时间复杂度,所以要多想一步,如何优化?针对具体问题,可以把5亿条数据分组来存放,这样就可以分别在每个文件的1000000个数据中,用哈希以及堆来统计每个区域内前100个频率最高的商品,最后求出所有记录中出现频率最高的前100个商品。
4、岗位需要的具体算法
这一类型的考察比较深入,以自然语言处理(NLP)岗位为例,在算法考察的过程中肯定不会简单的考察搜索等问题,可能直接考察word2vec的huffman tree 和negative sampling的目的是什么,另外还有机器学习领域的AUC曲线、PRF值能衡量什么等问题。
比如阿里巴巴机器学习算法面试:
学习过程中出现过拟合现象该怎么办?
1)重新清洗数据,有可能是因为数据不纯导致的过拟合。
2)增大数据的训练量,用于训练的数据量可能太小。
3)采用正则化方法,包括L0正则、L1正则和L2正则,在机器学习中一般使用L2正则。
4)采用dropout,这个方法在神经网络里面很常用,通俗一点讲就是在训练的时候让神经元以一定的概率不工作。
当然不同的应聘简历、不同的面试官都会导致问题的侧重有所区别,但万变不离其宗,尤其是前两种最常见的算法,一定不可以大意。
三、应对算法面试的解决方案
总结一下方法论,面试之前可以参考下面几个方式来提高面试成功的概率。
1、书本知识储备
在备战算法面试的过程中,首先还是要打牢基础,现在市面上有大量的针对面试算法的书籍,像《算法导论》、《编程珠玑》、《编程之美》都是不错的经典教材,在这里推荐一本面试经典算法题集锦——《剑指 offer》,这是一本实战类的讲解书,很贴近实际,很实用很接地气,其次像《程序员面试宝典》上面也都是常见的面试题目。
![动图封面](https://pica.zhimg.com/50/v2-a824e174fecda444cc12ed3357902b16_720w.jpg?source=1940ef5c)
2、视频手把手教学
很多技巧性的东西是书本上难以描述清楚的,但通过视频学习可以准确领悟老师的思想,比如慕课网上应对面试算法题的课程视频就有很多,“玩转算法面试 leetcode题库分门别类详细解析”、“程序猿的内功修炼,学好算法与数据结构”以及“看的见的算法 7个经典应用诠释算法精髓”,一线老师手把手为你揭秘算法面试的诀窍,这比自己领悟要来的快得多。
3、日常练习实践
纸上得来终觉浅,绝知此事要躬行。平时有时间一定要多刷一刷 leetcode、hihocoder,这这两个算法习题网站上很多题目思考起来还是很有意思的,也非常有代表性,因为在面试算法的过程中经常有要求现场码代码,虽然说不用完全按照编程语言的语法来写,但不勤加练习的话,也很难在现场完美表现。
![动图封面](https://pica.zhimg.com/50/v2-1322a40db0f7762d5102bcabbbc0a63f_720w.jpg?source=1940ef5c)
最后提醒各位面试者:从面试算法题中找出“正确”回答固然重要,但是面试官更想从中看到面试者合理的思考方向,而且算法面试优秀不意味着能够拿到Offer,想要得到心仪公司的Offer还是要脚踏实地学好每项技能,到时无论是什么考察方式都将是小菜一碟。最后祝各位面试的程序员早日找到心仪的工作~
推荐阅读:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK