【Book】剑指Offer -- By 何海涛

名企面试官精讲典型编程题


Comments

Contents

Chap 1. 面试的流程

  • 应聘者简历中如何介绍自己的项目?

    • 按照 STAR 模型来描述项目
    • Situation : 简短的项目背景
    • Task : 自己完成的任务。注意区分 参与负责
    • Action : 为完成任务自己做了那些工作,是怎么做的。
    • Result : 自己的贡献。
    • 栗子(作者自己在微软 Winforms 项目组的经历): Winforms 是微软 .NET 中一个成熟的 UI 平台(Situation)。本人的工作是在添加少量新功能之外主要负责维护已有的功能(Task)。新的功能主要让 Winforms 的控件风格和 Vista、Windows 7 的风格保持一致。在维护方面,对于较难的问题,我用 WinDbg 等工具进行调试(Action)。在过去的两年中,我共修改来超过 200 个 Bug(Result)。
  • 如何回答为什么跳槽?

    • 绝对禁止抱怨,不要流露负面情绪。绝对不能出现以下理由:
      1. 老板太苛刻
      2. 同事太难相处
      3. 加班太频繁
      4. 工资太低
    • 积极的思路 : 现在的工作做了一段时间,已经没有太多的激情了,因此希望寻找一份更有挑战性的工作。
    • 栗子1,作者从 Autodesk 跳槽到 MS : 我在 Autodesk 开发的软件 Civil 3D 是一款面向土木行业的设计软件。如果我想在现在的职位上得到提升,就必须加强土木行业的学习,可我对诸如计算土方量、道路设计等没有太多兴趣,因此出来寻找机会。
    • 栗子2,作者从 MS 去 思科 : 我在微软的工作主要是开发和维护 .NET 的 UI 平台 Winforms。 由于 Winforms 已经非常成熟,不需要添加多少新功能,因此我的大部分工作是维护和修改 Bug。两年下来,调试的能力得到了很大的提升,但长期如此,自己的软件开发和设计能力将得不到提高,因此想出来寻找可以设计和开发系统的职位。同时,我在过去几年里的工作都是开发桌面软件,对网络了解甚少,因此希望下一个工作能与网络相关。众所周知,思科是一家网络公司,这里的软件和系统或多或少都离不开网络,因此我对思科的职位很感兴趣。
  • 技术面试中应展现怎样的专业素质?

    • 基础知识扎实全面,包括编程语言、数据结构、算法等
    • 能写出正确的、完整的、robust 的高质量代码
    • 能思路清晰地分析、解决复杂问题
    • 能从时间、空间复杂度两个方面优化算法效率
    • 具备优秀的沟通能力、学习能力、发散思维能力
  • 应聘者提问环节?

    • 不要问和自己的职位没有关系的问题。比如问 公司未来五年的发展战略是什么
    • 不要问薪水
    • 不要立即打听面试结果
    • 问的问题必须是与应聘的职位或者项目相关的问题

Chap 2. 面试需要的基础知识

  • 关于编程语言

    以 C++ 为例,通常语言面试有 3 中类型。第一种是面试官直接问对 C++ 概念的理解,通常喜欢直接对 keywords 的理解程度。第二类就是面试官拿出准备好的代码,让应聘者分析代码的运行结果。这种题型选择的代码通常包含比较微妙复杂的语言特性。这要求应聘者对 C++ 的考点有着透彻的理解。第三类题型就是要求应聘者写代码定义一个类型或者实现类型中的成员函数。重点考察构造函数,析构函数和运算符重载。

  • 关于数据结构

    ArrayString 是两种最基本的数据结构,它们用连续内存分别存储着数字和字符。ListTree面试中出现频率最高的数据结构。由于操作 List 和 Tree 需要大量的指针,应聘者在解决相关问题的时候一定要留意代码的robust,否则容易出现程序崩溃的问题。Stack 是一个与 recursion algo 紧密联系的数据结构,同样 queue 也是与广度优先遍历算法紧密相关,深刻理解这两种数据结构有助于我们解决很多算法问题。

  • 关于算法

    有很多算法都可以用 recursion 和 loop 两种不同的方式实现,recursion 实现的代码比较简介,用 loop 的效率会比较高。在面试的时候,可以根据题目的特点,甚至和面试官讨论选择合适的方法编程。
    通常 sorting 和 search 是面试时考察算法的重点。在准备面试的时候,应该重点掌握 binary search, merge sort 和 quick sort 。
    如果面试题要求在二维数组上 search path,那么可以尝试用 回溯法。通常 回溯法 很适合用递归的代码实现。只有当面试官限定不能用recursion 实现的时候,再考虑用 stack 来模拟 recursion 的过程。
    如果面试题是求某个问题的最优解,并且该问题可以分为多个之问题。那么可以尝试使用 动态规划(Dynamic Programming, DP)。在用自上而下的recursion 思路去分析 DP 问题的时候,我们会发现之问题之间存在重叠的更小的子问题。To avoid unnecessary computation, 可以才用自上而下的 loop 来实现,在实现过程中把 子问题的最优解保存在数组中,然后再基于子问题的最优解计算大问题的解。如果面试官提醒说在分解子问题的时候是不是存在着某个特殊的选择,如果采用这个特殊的选择将一定得到最优解,那么通常面试官这样的提示往往意味着可能适用与 greedy algo。当然,面试官也会要求应聘者证明 greedy algo 最终可以得到最优解。
    最后,Bitwise operations 可以看作一类特殊的算法。直接对二进制的 01 进行操作,掌握起来也不难,因为一共就有 &,|,~,^,<<,>> 六种操作。

Chap 3. 高质量的代码

Chap 4. 解决面试题的思路

Chap 5. 优化时间和空间效率

Chap 6. 面试中的各项能力

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值