算法面试到底是什么鬼?

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

算法面试的目的 展现思考问题的方式 算法面试过程 看做是和面试官一起探讨一个问题的解决方案。对于问题的细节和应用环境,可以和面试官沟通。 这种沟通本身很重要,它暗示着你思考问题的方式。

我们需要对一组数据进行排序。 快速排序算法 O(nlogn)

正确+更优 这组数据有什么样的特征? 有没有可能包含有大量的重复元素? 如果有这种可能的话,三路快排是更好的选择。 Java 默认是三路快排。

这组数据有什么样的特征? 是否大部分数据距离它的正确位置很近?是否近乎有序? 如果是这样的话插入排序更优

是否数据的取值范围非常有限?比如学生成绩排序。 计数排序更优

对排序有什么额外的要求 是否需要稳定排序 归并排序更优

数据的存储状况是怎样的 如果使用链表存储,归并排序更优

数据的大小是否可以装在内存里, 外部排序

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

正确还包含对问题的独到见解,容错性,

1-2 算法面试只是面试的一部分

算法面试优秀不意味着技术面试优秀

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

项目经历和项目中遇到的实际问题

你遇到印象最深的bug是什么?

面向对象

设计模式

网络相关:安全相关,内存相关,并发相关

系统设计: scalability

面试不仅仅是考察技术水平,以及对过去项目的思考

项目经历

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

遇到的最大的挑战

犯过的错误

遇到的失败

最享受的工作内容

遇到冲突的处理方式

做的最与众不同的事儿

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

1-3 如何准备算法面试

避免完美学习

使用时间片学习

远远不需要达到竞赛的水平

不要轻视基础算法和数据结构,而只关注有意思的题目

  • 各种排序算法
  • 技术数据结构和算法的实现: 如堆,二叉树,图
  • 基础数据结构的使用: 如链表、栈、队列、哈希表、图、Tire、并查集
  • 基础算法: 深度优先、广度优先、二分查找、递归
  • 基本算法思想:递归、分治、回溯搜索、贪心、动态规划

选择合适的OJ online judge

leetcode: online portal for interview

hackRank: Revolutionizing Tech recruiting

acmcode

竞赛类oj

codeforces

topcoder

codechef

1-4 如何回答算法面试问题

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

注意题目中的条件,

给定一个有序数组

有一些题目中的条件本质是暗示

  • 设计一个O(nlogn)的算法 分治
  • 无需考虑额外的空间
  • 数据规模大概是10000

nlogn 百万级或者千万级别

没有思路的时候给自己几个简单的用例

暴力解法是思考的起点

3:Longest Substring without Repeating characters

在一个字符串中寻找没有重复字母的最长子串

优化算法

遍历常见的算法思路

遍历常见的数据结构

空间和时间的交换 哈希表

预处理信息 排序

在瓶颈处寻找答案:

实际编写问题

极端条件的判断

数组为空,字符串为空,

变量名

模块化和复用性