如何准备算法面试

1.算法面试解析

  • 对一组数据进行排序?背后所隐藏的问题?

    • 不仅仅是快排(O(NlogN))
    • 大量重复的元素–>三路快排
    • 近乎有序–>插入排序
    • 数据的取值范围非常有限?比如学生成绩排序,–>计数排序
    • 对 排序的要求?是否稳定–>归并排序
    • 数据的存储状况–>快排基于数组的随机选择,如果是链表的话,可能使用归并更合适
    • 数据的存储状况?数据的大小是否可以装载在内存里?不足以装载在内存中–>外部排序
  • 什么是“正确”的回答一个算法?正确的含义?

    • 运行正确,无bug
    • 对问题的独到见解
    • 优化
    • 代码规范
    • 容错性
    • 对于非常难得问题,关键在于所表达出的解决问题的思路。
  • 算法面试优秀不意味技术面试的优秀

    • 项目经历和项目中遇到的问题
    • 设计模式
    • 网络相关
    • 操作系统相关
  • 通过过去了解思考行为方式

    • 遇到的最大的挑战
    • 犯过的错误
    • 遭遇的失败
    • 最享受的工作内容
    • 遇到冲突的处理方式
    • 做的最与众不同的事情?
  • 准备好合适的问题问面试官?

    • 整个小组的大概运行模式怎么样的?
    • 这个产品中的某个问题是如何解决的?
    • 为什么选择某些技术?标准?
  • 如何准备算法面试?

    • 准备面试和准备算法面试是两回事。

    • 准备算法面试和学习算法也是不一样的,不需要读《算法导论》

    • 学习切勿完美主义

    • 高级数据结构和算法面试中提及的概率很低,只需要知道基本的概念即可,

      • 红黑树
      • B-Tree
      • 斐波那契堆
      • 计算几何
      • 数论
      • FFT(傅里叶变换)
    • 不要轻视基础算法和数据结构

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

      • LeetCode,真实的面试问题
      • HackerRank,最问题的分类很详细,较难
    • 在学习和实践做题之间,要掌握平衡

      • 不要盲目刷题,要重视思考
    • 解决算法面试问题的整体思路

      • 注意题目中的条件

        • 给定一个有序数组
        • 题目条件本质是暗示
        • 设计一个O(nlogn)的算法
        • 无须考虑额外的空间
        • 数据规模大概是10000
    • 当没有思路的时候

      • 自己给自己几个简单的测试用例,试验一下
      • 不要忽视暴力解法,暴力解法通常是思考的起点
    • 优化算法

      • 遍历常见的算法思路
      • 遍历常见的数据结构
      • 空间和时间的交换(哈希表)
      • 预处理信息(排序等)
      • 在瓶颈处寻找答案
      • O(nlongn)+O(n^2),显然要优化O(n^2)
    • 实际编写问题

      • 极端条件的判断
      • 数组为空?字符串为空?数量为0?指针为NULL
      • 变量名
      • 模块化,复用性
    • 参考

      • 玩转算法面试

你可能感兴趣的:(玩转算法面试)