算法与面试之-如何准备算法面试

主要介绍算法面试的一些问题、以及如何准备算法面试java

算法面试不只仅是正确的回答问题

对于面试中遇到的大多数问题,都能有一个合理的思考路径git

什么是算法面试?

  • 让你们在面对面试中的算法问题时,有一个合理的思考路径:
  • 不表明可以“正确”回答每个算法问题,可是合理的思考方向其实更重要,也是正确完成算法面试问题的前提
  • 算法面试优秀不意味着技术面试优秀
  • 技术面试优秀不意味着可以拿到Offer

什么是给出合理的思考路径?

  • 算法面试的目的不是给出一个“正确”答案,
  • 而是展现给面试官你思考问题的方式。

“正确”自己是一个相对概念

  • 算法面试不是高考。
  • 把这个过程看做是和面试官一块儿探讨一个问题的解决方案。
  • 对于问题的细节和应用环境,能够和面试官沟通。
  • 这种沟通自己很重要,它暗示着你思考问题的方式。

例子

咱们须要对一组数据进行排序github

  • 设计排序接口,标准库的设计,业务中排序算法。
  • 排序是基础操做,很重要。

解决面试

快速排序算法:O(nlogn)算法

  • 忽略了算法使用的基础环境。要动态选择。

(向面试官提问):这组数据有什么样的特征?设计模式

  • 有没有可能包含有大量重复的元素?
  • 若是有这种可能的话,三路快排是更好地选择。
  • 普通数据:普通快速排序就好了;java语言标准库排序使用的三路快排。
  • 是否大部分数据距离它正确的位置很近?是否近乎有序?
  • 若是是这样的话,插入排序是更好地选择。
    • 按照业务发生顺序,先发生先完成,几乎有序,插入排序是更好的选择。
  • 是否数据的取值范围很是有限?好比对学生成绩排序。
    • 若是是这样的话,计数排序是更好地选择。高考成绩取值范围有限:计数排序更好。

(向面试官提问):对排序有什么额外的要求?数组

  • 是否须要稳定排序?
    • 若是是的话,归并排序是更好地选择。

(向面试官提问):数据的存储情况是怎样的?安全

  • 是不是使用链表存储的?
    • 若是是的话,归并排序是更好地选择。
    • 快排依赖于数组的随机存取。

(向面试官提问):数据的存储情况是怎样的?微信

  • 数据的大小是否能够装载在内存里?
    • 数据量很大,或者内存很小,不足以装载在内存里,须要使用外排序算法。

对一组数据进行排序小结

  • 有没有可能包含有大量重复的元素?
  • 是否大部分数据距离它正确的位置很近?是否近乎有序?
  • 是否数据的取值范围很是有限?好比对学生成绩排序。
  • 是否须要稳定排序?
  • 是不是使用链表存储的?
  • 数据的大小是否能够装载在内存里?

什么是“正确”的回答一个算法问题

  • 正确除了你能把代码编出来运行出正确的结果。正确还包含对问题的独到看法;优化;代码规范;容错性;
    • 不只仅是给出解决算法问题的代码,还要把上面因素包括。
    • 若是是很是难的问题,对你的竞争对手来讲,也是难的。
  • 关键在于你所表达出的解决问题的思路。
  • 甚至经过表达解题思路的方向,得出结论:这个问题的解决方案,应该在哪个领域,我能够经过查阅或者进一步学习解决问题。

算法面试只是面试的一部分

  • 算法面试只是技术面试的一部分。
  • 根据你的简历和应聘职位的不一样,势必要考察其余技术方面。
  • 项目经历和项目中遇到的实际问题
    • 解决能力,是否参与
    • 深刻思考
    • 技术态度

面试前梳理本身简历上所写到的项目:整理一下可能会问到的。网络

  • 你遇到的印象最深的bug是什么?
  • 面向对象
  • 设计模式
  • 网络相关;安全相关;内存相关;并发相关;…
  • 系统设计;scalability(大规模)

技术面试优秀不意味着可以拿到Offer

技术面试只是面试的一部分。面试不只仅是考察你的技术水平,仍是了解你的过去以及造成的思考行为方式。

  • 关于过去:参与项目相当重要

项目经历:

  • 工做人士
  • 研究生
  • 本科生
    • 毕业设计
    • 其余课程设计(大做业)

如何找到项目?

  • 实习
  • 建立本身的项目
    • 本身作小应用:计划表;备忘录;播放器…
    • 本身解决小问题:爬虫;数据分析;词频统计...
    • “不是项目”的项目:一本优秀的技术书籍的代码整理等…(github)
    • 分享:本身的技术博客;github等等

行为类问题

经过过去了解你的思考行为方式:

  • 遇到的最大的挑战?
  • 犯过的错误?
  • 遭遇的失败?
  • 最享受的工做内容?
  • 遇到冲突的处理方式?
  • 作的最不同凡响的事儿?

具体阐述:我在某某项目中遇到一个怎样的算法问题:这个问题是怎样的。它是我遇到的最大的挑战,我是如何克服解决的。

准备好合适的问题问面试官

  • 整个小组的大概运行模式是怎样的?
  • 整个项目的后续规划是如何的?
  • 这个产品中的某个问题是如何解决的?
  • 为何会选择某些技术?标准?
  • 我对某个技术很感兴趣,在你的小组中我会有怎样的机会深刻这种技术?

算法面试仍然是很是重要的一部分

如何准备算法面试

准备面试和准备算法面试 是两个概念

  • 算法面试,只是面试中的一个环节。
  • 远远不须要啃完一本《算法导论》
    • 强调理论证实
    • 第一遍读不须要弄懂证实
    • 前几遍阅读应该记住结论就好了,不须要弄懂证实。把更多的精力放在算法思想上。
  • 针对算法面试,算法导论里面的理论推导和证实不是很重要的方面。

学习切记完美主义

  • 高级数据结构和算法面试说起的几率很低

说起很低的算法

  • 基础的概念要知道,可是不须要实现等更深刻的层面。
  • 远远不须要到达信息学竞赛的水平

面试不是acm

算法面试的准备范围

  • 不要轻视基础算法和数据结构,而只关注“有意思”的题目
  • 各类排序算法
  • 基础数据结构和算法的实现:如堆、二叉树、图…
  • 基础数据结构的使用:如链表、栈、队列、哈希表、图、Trie、并查集…
  • 基础算法:深度优先、广度优先、二分查找、递归…
  • 基本算法思想:递归、分治、回溯搜索、贪心、动态规划…

例子

Intel的面试题:

初始序列为1 8 6 2 5 4 7 3的一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为:( )

A. 8 3 2 5 1 6 4 7

B. 3 2 8 5 1 4 6 7

C. 3 8 2 5 1 6 7 4

D. 8 2 3 5 1 4 7 6

乐视的面试题:

对一个含有20个元素的有序数组作二分查找,数组起始下标为1,则查找A[2]的比较序列的下标为()

A. 九、五、四、2

B. 十、五、三、2

C. 九、六、2

D. 20、十、五、三、2

考查二分查找法。

阿里巴巴面试题

一组记录排序码为(五、十一、七、二、三、17),则利用堆排序方法创建的初始堆为()

A. (十一、五、七、二、三、17)

B. (十一、五、七、二、1七、3)

C. (1七、十一、七、二、三、5)

D. (1七、十一、七、五、三、2)

E. (1七、七、十一、三、五、2)

F. (1七、七、十一、三、二、5)

百度面试题

在图采用邻接表存储时,求最小生成树的Prim算法的时间复杂度为( )

  • O(n)
  • O(n+e)
  • O(n^2)
  • O(n^3)

重点关注

  • 基础数据结构的使用:如链表、栈、队列、哈希表、图、Trie、并查集…
  • 基础算法:深度优先、广度优先、二分查找、递归…
  • 基本算法思想:递归、分治、回溯搜索、贪心、动态规划…

选择合适的OJ(Online judge):在线判题系统

  • 不要选择过于偏向程序设计竞赛的OJ *面向竞赛难度太高

面向竞赛

  • 选择合适的oj

  • leetcode

  • HankeRank

    HankeRank

    • 特色是对于问题的分类很详细。偏难,不过能够对某一类细分问题解决。
    • www.hackerrank.com

注意

  • 在学习和实践作题之间,要掌握平衡
  • 基础算法实现与算法思想

如何回答算法面试问题

解决算法面试问题的总体思路

  • 注意题目中的条件
    • 给定一个有序数组...(二分法)
  • 有一些题目中的条件本质是暗示
    • 设计一个O(nlogn)的算法(分治:在一颗搜索树中完成任务,对于数据排序)
    • 无需考虑额外的空间(用空间换时间上的优化)
    • 数据规模大概是10000(O(n^2)就能够)

当没有思路的时候

  • 本身给本身几个简单的测试用例,试验一下
  • 不要忽视暴力解法。暴力解法一般是思考的起点。

例子

LeetCode 3 Longest Substring Without Repeating Characters

在一个字符串中寻找没有重复字母的最长子串
如”abcabcbb”,则结果为”abc”
如”bbbbb”,则结果为”b”

  • 对于字符串s的子串s[i...j]

  • 使用O(n^2)的算法遍历i,j,能够获得全部的子串s[i...j]

  • 使用O(length(s[i...j]))的算法判断s[i...j]中是否含有重复字母

  • 三重循环:复杂度O(n^3),对于n=100的数据,可行

优化算法

  • 遍历常见的算法思路

  • 遍历常见的数据结构

  • 空间和时间的交换 (哈希表)

  • 预处理信息(排序)

  • 在瓶颈处寻找答案:O(nlogn) + O(n^2) ; O(n^3)

    • O(n^2)可否优化。
  • 什么样的问题使用什么样的思路和数据结构。

实际编写问题

  • 极端条件的判断

    • 数组为空?
    • 字符串为空?
    • 数量为0?
    • 指针为NULL?
  • 代码规范:

    • 变量名
    • 模块化
    • 复用性

-------------------------华丽的分割线--------------------

看完的朋友能够点个喜欢/关注,您的支持是对我最大的鼓励。

我的博客番茄技术小栈掘金主页

想了解更多,欢迎关注个人微信公众号:番茄技术小栈

番茄技术小栈