玩转算法面试-- Leetcode真题分门别类讲解

如何“正确”的回答一个算法问题

对一组数据进行排序:

1、这组数据有什么样的特征?

     ①有没有可能包含有大量重复的元素?

    如果有这种可能的话,三路快排是更好的选择(Java种快排的基本实现就是使用三路快排)。

     ②是否大部分数据距离它正确的位置很近?是否近乎有序?

    如果是这样的话,插入排序是更好的选择(如对银行的业务按照业务发生的时间进行排序,大多数业务先发生也先结束,少数处理的业务先发生但是处理时间较长后结束)。

     ③是否数据的取值范围非常有限?比如对学生成绩排序(对高考成绩进行排序,0-700)。

    如果是这样的话,计数排序是更好的选择。

2、对排序有什么额外的要求?

     ①是否需要稳定排序?

    如果是的话,归并是更好的选择。

3、数据的存储状况是怎样的?

    注:快排非常依赖于数组的随机存取

     ①是否使用链表存储的?

    如果是的话,归并排序是更好的选择。

     ②数据的大小是否可以装载在内存里?

    数据量很大,或者内存很小,不足以装载在内存里,需要使用外排序算法。

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

     项目经历 和 项目中遇到的实际问题
     遇到的印象最深的bug是什么?
     面向对象
     设计模式
     网络相关;安全相关;内存相关;并发相关
     系统设计;scalability

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

    技术面试只是面试的一部分。面试不仅仅是考察你的技术水平,还是了解你的过去以及形成的思考行为方式。关于过去:参与项目至关重要
     通过过去了解你的思考行为方式:
    遇到的最大的挑战?
    犯过的错误?
    遭遇的失败?
    最享受的工作内容?
    遇到冲突的处理方式?
    做的最与众不同的事?

     准备好合适的问题问面试官:
    整个小组的大概运行(工作)模式是怎样的?
    整个项目的后续规划是如何的(大概了解了入职后需要做的项目)?
    这个产品中的某个问题是如何解决的?
    为什么会选择某些技术?标准?
    我对某个技术很感兴趣,在你的小组中我会有怎样的机会去深入这种技术?

如何准备算法面试

    算法面试,只是面试中的一个环节。
     远远不需要啃完一本《算法导论》(过于强调理论证明)
     高级数据结构和算法面试提及的概率很低(普遍角度):
    --红黑树
    --B-Tree
    --斐波那契堆
    --计算几何
    --数论
    --FFT

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

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

     给定一个有序数组…
     有一些题目的条件本质是暗示:
    --设计一个O(nlogn)的算法
    --无需考虑额外空间
    --数据规模大概是10000

你可能感兴趣的:(LeetCode)