知识结构:
常见的数据结构及其实现
常见的数据结构主要有数组、链表、栈、队列、二叉堆、树、图等,其中栈和队列的题目经常出现在笔试试卷中,而且实际算法面试中二叉堆和图考得很少,经常出现的是数组、链表和二叉树这几种数据结构类型的题目
(1) 数组虽然是最基础的数据结构,但是能考的东西却非常多,例如最常见的排序算法、找数组中第k大的数字、找两个有序数组的中位数等
(2) 链表因其特殊的结构也是常考点,例如反转链表、链表元素排序、合并两个有序链表、判断链表是否有环、有环的话环的起点在哪里等
(3) 二叉树由于其天然的递归结构,是最适合考查递归思想的数据结构,例如判断二叉树是否平衡、判断二叉树是否相同、判断二叉树是否对称等
(4) 栈和队列也是很重要的数据结构,但是它们往往只是作为前期的笔试题,栈经常出的题目就是给出一个栈的入栈序列,问下面哪个不可能是这个栈的出栈序列。栈和队列作为算法题并不多,常见的就是如何用两个栈来实现一个队列或者利用一个辅助栈来将一个栈中的元素排序
一般来说,Android开发岗位的算法面试是不会出题要求面试者临时设计一个数据结构来解决某个问题,大多数时候只是要求面试者能够熟练掌握常见的数据结构及其实现、能够说出这种数据结构的优缺点即可
算法时间复杂度的计算
面试官会问复杂度,如果复杂度较高会问你有没有更优解。算法的运行时间主要有三种表示符号,但是最常见的就是大O表示法。此外,算法导论中介绍了三种时间复杂度的计算方法,分别是代换法、递归树法和主定理法。
常见的算法思想,有递归、分治、贪心、动规等等
Induction(推导)、Recursion(递归)、Reduction(规约)和Divide and Conquer(分治)、贪心、动态规划
贪心算法其实还是比较好想到的,它真正难的是如何证明这个贪心策略是正确的,建议刷下LeetCode上的贪心题,虽然实际算法面试中很少出贪心题
动规算法在紧张的算法面试时并不容易想出来,个人感觉就是要多练习,然后学会列出动规的递推公式,处理好边界情况,最后选择合适的实现方式去实现。实际算法面试中如果遇到水平较高的面试官是有可能出动规题的,其中最常见的就是最长公共子序列和最长递增子序列等类型的题目
面试准备:
-
知识储备
基本的数据结构、排序算法、时间复杂度
数据结构在java中的运用——集合框架
常见排序 -
刷题
题多时间少:
常见10种排序、数组、链表、栈、队列、二叉树 (集合)基本概念和使用
常见排序算法、数据结构(集合、二叉树)复杂度,一般算法复杂度的估算
排序算法、top面试题库50题
tips:超过十分钟直接看答案,用纸笔辅助思考,小阶段结束后总结错误和题目特点
有强于无,给出暴力解法,和面试官迭沟通改进,这过程本身也是一个优秀的思路
1、先刷高频题(数组、链表、二叉树等类型题),从探索模块分类开始或者从简单模块开始,
2、如果时间充足再刷自己相对薄弱的环节,插入少量hard扩展思路;
3、如果时间不充足的话那就直接看题看解答,可以反复看反复记,刷题后按照题目类型分类归纳。有点档次的企业也看重解题思路,且遇到原题机会不多,所以不要硬记答案
4、时间,难题三十分钟,简单题15分钟之内,开始练习时候宽限在40min,简单题25min
有可行但不是最佳方案比木有方案要强,一时想不出最佳方案可以边写边改进
5、有时间需要安排LeetCode模拟面试
此外:对于那些经典或自己不明白的问题要把收藏起来,定期的去回顾这些题目,这样会慢慢的加强个人的思维能力。
最重要的一点就是要多动手去练,别以为一道题目很简单,等你写完提交上去的时候你会发现很多问题,而我们就是在不断遇到问题然后去解决的过程中加强自己的能力。
LeetCode上的题解建议放在手机中,随时查看
大神代码
- 手撕代码
手写代码之前一定要先和面试官沟通好,确保你完全正确地理解了题目的意思,想好思路之后再开始写,否则噼里啪啦写了一堆没用而且还有错误的代码让面试官看了会留下不好的印象。
在线编程和线下手写代码是没有代码提示的,所以平时有必要多练习手写代码,千万不要犯明显的基本语法错误,同时要注意代码风格,例如代码格式、变量命名、函数命名等,必要的时候做些防御性编程以及边界值检查等操作。
在没有直接想出最优解的情况下你可以先说出最直观的暴力解法,利用这段时间慢慢思考有没有其他的更优的解法,问面试官能不能给出思路提示,尊重、倾听与沟通很重要
- 参考
常见面试算法题汇总一
长远来看,如何学好算法
怎样才能学好算法
这个问题回答起来,基本上很难。正如回答如何才能学好C++一样。个人的几点建议:
首先要学好数学,有高等数学、高等代数、离散数学、数据结构等方面的基础。
然后多看一些代码,研究它的算法。多练习一些算法的实现。
另外,算法是需要经验的,也是一个很吃基本功的东西,好的算法是在通过扎实的基本功和潜心的研究得到的。正如想要下好围棋,你需要首先掌握围棋的基本技法,然后可以先记住一些定式、死活技巧,最重要是不停的下,从中学习经验。
最后,多看一些趣味题,甚至脑筋急转弯的题目。很多看似和算法无关的东西其实都可以影响你的思维方法,例如36计。
算法是一种解决问题的思路,算法不用学,大家都会,因为解决问题的思路大家都有,只是有好和坏的区别罢了 ,我们学习算法目的是提高我们思考问题的能力,不说要当个象高斯一样的数学家,至少要比那些没学过算法的人聪明一点点。
闲扯
如果技术不能出彩,就展示自己的沟通能力,这一是让面试官觉得很愿意和你合作,二这也是很重要的一项工作技能。
网友评论