剑指Offer——读书笔记

@[C++|面试|数据结构|算法]

高质量的代码

代码的规范性

  • 书写清晰
  • 布局清晰
  • 命名合理

代码的完整性

  • 完成基本功能
  • 考虑边界条件
  • 做好错误处理

代码的鲁棒性

  • 采取防御式编程
  • 处理无效的输入

优化时间和空间效率

编程面试的时候,面试官通常对时间复杂度和空间复杂度都会有要求,并且一般情况下面试官更加关注时间复杂度。

降低时间复杂度的方法:

  • 改用更加高效的算法,如联想快速排序中的Partition,采用动态规划等算法
  • 用空间换取时间,经常通过辅助内存和简单的哈希表,实现利用较小的空间的消耗提高时间效率

当然,也不是所有情况下,以空间换取时间都是可行的

  • 如果辅助空间消耗的太多,可能得不偿失
  • 如果是在嵌入式开发等对空间要求较高的情况下,也要格外注意空间消耗

解决面试题的思路

画图

图形化能使抽象的问题形象化。当面试题涉及链表、二叉树等数据结构时,如果在纸上画几张草图,题目中隐藏的规律就有可能变得很直观。

举列

一两个例子能使抽象的问题具体化。很多与算法相关的问题都很抽象,未必一眼就能看出它们的规律。这个时候我们不妨举几个例子,一步一步模拟运行的过程,说不定就能发现其中的规律,从而找到解决问题的窍门。

分解

把复杂的问题分解成若干个小问题,是解决很多复杂问题的有效方法。如果我们遇到的问题很大,可以尝试先把大问题分解成小的问题,然后递归地解决这些小问题。分治法、动态规划等方法都是应用分解复杂问题的思路。


面试中的各项能力

“应聘者会被问及一些需求不是很明确的问题,解决这些问题需要应聘者和面试官进行沟通,以及在讲解思路和代码的过程中与需要和面试官交流互动。沟通及学习能力是面试成绩中关键的考察点。” ——尧敏(淘宝,资深经理)

应聘者的综合素质

  • 编程能力
  • 沟通能力
  • 学习能力
  • 知识迁移能力
  • 发散思维能力
  • 抽象建模能力
  • ...

沟通能力和学习能力

随着软件、系统功能越来越复杂,开发团队的规模越来越大,开发者、测试者和项目经理的沟通交流变得越来越重要。因此在面试过程中,面试官也越来越看重沟通能力,因此也常常在面试的过程中,面试题描述比较含糊,从而希望应聘者能够主动沟通,充分理解题意,有效表达自己的想法和见解。

而对于学习能力,由于软件技术发展日新月异,只有具备很强的学习能力和学习欲望的人,才能不断完善自己的知识结构,不断学习新的现金技术,让自己职业生涯保持长久的生命力。

知识迁移能力

知识迁移能力的通俗说法就是“举一反三”的能力。能够根据已知的知识来理解新的概念,以及根据解决一道题的思路,从而去解决一类问题。如面试题求解二叉树的深度

int TreeDepth(BinaryTreeNode* pRoot)
{
    if(pRoot == NULL)
        return 0;
        
    int nLeft = TreeDepth(pRoot->m_pLeft);
    int nRight = TreeDepth(pRoot->m_pRight);
    
    return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1); 
}

知识迁移能力能够帮助我们轻松地解决很多问题。有些面试官在提问难题之前,会问一道相关但比较简单的题目,也是希望我们能够从解决问题的过程中受到启发,最总解决较为复杂的问题。

抽象建模能力

  • 建模的第一步就是选择合理的数据结构来表述问题。实际生产生活中的问题千变万化,而常用的数据结构却只有有限的几种。
  • 建模的第二部就是分析模型中的内在规律,并用编程语言表述这种规律。

发散思维能力

  • 发散思维的特点是思维活动的多向性和变通性,也就是我们在思考问题时注重运用多思路、多方案、多途径地解决问题。
  • 通过考查发散思维能力,面试官能够
    • 了解应聘者探索新思路的激情
    • 了解应聘者的灵活性和变通性
    • 了解面试者知识面的广度和深度

备注:文中主要内容参考《剑指Offer》——何海涛,书中有很多编程实例,就不在这里赘述了,推荐急于找工作的同学和感兴趣的人阅读

你可能感兴趣的:(剑指Offer——读书笔记)