剑指Offer

剑指Offer

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

8.3820 评价豆瓣读书
免费试读

作品简介

《剑指Offer:名企面试官精讲典型编程题》剖析了50个典型的程序员面试题,从基础知识、代码质量、解题思路、优化效率和综合能力五个方面系统整理了影响面试的5个要点。全书分为7章,主要包括面试的流程,讨论面试流程中每一环节需要注意的问题;面试需要的基础知识,从编程语言、数据结构及算法三方面总结了程序员面试的知识点;高质量的代码,讨论影响代码质量的3个要素(规范性、完整性和鲁棒性),强调高质量的代码除了能够完成基本的功能之外,还能考虑到特殊情况并对非法输入进行合理的处理;解决面试题的思路,总结在编程面试中解决难题的常用思路,如果在面试过程中遇到了复杂的难题,应聘者可以利用画图、举例和分解复杂问题3种方法化繁为简,先形成清晰的思路再动手编程;优化时间和空间效率,介绍如何优化代码的时间效率和空间效率,读完这一章读者将学会常用的优化时间效率及空间换时间的常用算法,从而在面试中找到最优的解法;面试中的各种能力,本章总结应聘者在面试过程中如何表现学习能力和沟通能力,并通过具体的面试题讨论如何培养知识迁移能力、抽象建模能力和发散思维能力;两个面试案例,这两个案例总结了应聘者在面试过程中哪些举动是不好的行为,而哪些表现又是面试官所期待的行为。

何海涛,现思科高级软件工程师,曾先后就职于Autodesk和微软。分别于2003年和2006年于浙江大学获得计算机专业学士和硕士学位。主要关注程序员求职应聘领域、以及软件设计、开发和调试技术。著有《剑指Offer——名企面试官精讲典型编程题》一书。

作品目录

载入中

热门划线

  1. 面试官除了希望应聘者的代码能够完成基本的功能之外,还会关注应聘者是否考虑了边界条件、特殊输入(比如NULL指针,空字符串等)及错误处理。5 人
  2. 如果在面试的时候遇到难题,我们有3种办法分析、解决复杂的问题:画图能使抽象问题形象化,举例使抽象问题具体化,分解使复杂问题简单化。5 人
  3. 第二种方式是当发生错误时设置一个全局变量。4 人
  4. 面试题37:两个链表的第一个公共结点4 人
  5. 应聘者在写代码的时候,最好用完整的英文单词组合命名变量和函数,以便面试官能一眼读懂代码的意图。3 人
  6. 通常我们可以从功能测试、边界测试和负面测试三方面设计测试用例,以确保代码的完整性3 人
  7. 面试题31:连续子数组的最大和3 人
  8. 讨论影响代码质量的的3个要素(规范性、完整性和鲁棒性)2 人
  9. 在共享桌面远程面试过程中,面试官最关心的是应聘者的编程习惯及调试能力。2 人
  10. STAR模型描述自己经历过的每一个项目。2 人
  11. Winforms是微软.NET中的一个成熟的UI平台(Situation)。本人的工作是在添加少量新功能之外主要负责维护已有的功能(Task)。新的功能主要是让Winforms的控件的风格和Vista、Windows 7的风格保持一致。在维护方面,对于较难的问题我用WinDbg等工具进行调试(Action)。在过去两年中我总共修改了超过200个Bug(Result)。2 人
  12. 面试小提示:在介绍项目经验(包括在简历上介绍和面试时口头介绍)时,应聘者不必详述项目的背景,而要突出介绍自己完成的工作及取得的成绩。2 人
  13. 在介绍项目经验(包括在简历上介绍和面试时口头介绍)时,应聘者不必详述项目的背景,而要突出介绍自己完成的工作及取得的成绩。2 人
  14. 在参加面试之前,应聘者需要熟练掌握链表、树、栈、队列和哈希表等数据结构,以及它们的操作2 人
  15. 其次是不要问薪水2 人
  16. 通常语言面试有3种类型。第一种类型是面试官直接询问应聘者对C++概念的理解。2 人
  17. 第三种题型就是要求应聘者写代码定义一个类型或者实现类型中的成员函数。2 人
  18. 由于数组中的内存是连续的,于是可以根据下标在O(1)时间读/写任何元素,因此它的时间效率是很高的。2 人
  19. 合并两个数组(包括字符串)时,如果从前往后复制每个数字(或字符)需要重复移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。2 人
  20. 上面的基于递归的代码看起来很简洁,但有个问题:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显式用栈基于循环实现的代码的鲁棒性要好一些。2 人
  21. 堆分为最大堆和最小堆。在最大堆中根结点的值最大,在最小堆中根结点的值最小。有很多需要快速找到最大值或者最小值的问题都可以用堆来解决。2 人
  22. 红黑树是把树中的结点定义为红、黑两种颜色,并通过规则确保从根结点到叶结点的最长路径的长度不超过最短路径的两倍。2 人
  23. 位运算可以看成是一类特殊的算法,它是把数字表示成二进制之后对0和1的操作。由于位运算的对象为二进制数字,所以不是很直观,但掌握它也不难,因为总共只有与、或、异或、左移和右移5种位运算。2 人
  24. 如果面试题是要求在排序的数组(或者部分排序的数组)中查找一个数字或者统计某个数字出现的次数,我们都可以尝试用二分查找算法。2 人
  25. 为了避免死循环,我们可以不右移输入的数字i。首先把i和1做与运算,判断i的最低位是不是为1。接着把1左移一位得到2,再和i做与运算,就能判断i的次低位是不是1……这样反复左移,每次都能判断i的其中一位是不是1。2 人
  26. 把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。很多二进制的问题都可以用这个思路解决。2 人
  27. 通常我们有3种方式把错误信息传递给函数的调用者。第一种方式是函数用返回值来告知调用者是否出错。2 人
  28. 由于计算机表示小数(包括float和double型小数)都有误差,我们不能直接用等号(==)判断两个小数是否相等。如果两个小数的差的绝对值很小,比如小于0.0000001,就可以认为它们相等。2 人
  29. 判断一个单向链表是否形成了环形结构。和前面的问题一样,定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快的指针走到了链表的末尾(m_pNext指向NULL)都没有追上第一个指针,那么链表就不是环形链表。2 人
  30. 二叉树相关的代码有大量的指针操作,每一次使用指针的时候,我们都要问自己这个指针有没有可能是NULL,如果是NULL该怎么处理。2 人
  31. 面试题22:栈的压入、弹出序列2 人
  32. 第一部分是左子树结点的值,它们都比根结点的值小;第二部分是右子树结点的值,它们都比根结点的值大。2 人
  33. 输入整数的所有路径2 人
  34. 面试题26:复杂链表的复制2 人
  35. 我们可以先创建一个大小为k的数据容器来存储最小的k个数字,接下来我们每次从输入的n个整数中读入一个数。如果容器中已有的数字少于k个,则直接把这次读入的整数放入容器之中;如果容器中已有k个数字了,也就是容器已满,此时我们不能再插入新的数字而只能替换已有的数字。找出这已有的k个数中的最大值,然后拿这次待插入的整数和最大值进行比较。如果待插入的值比当前已有的最大值小,则用这个数替换当前已有的最大值;如果待插入的值比当前已有的最大值还要大,那么这个数不可能是最小的k个整数之一,于是我们可以抛弃这个整数。2 人
  36. 假设题目是要求从海量的数据中找出最小的k个数字,由于内存的大小是有限的,有可能不能把这些海量的数据一次性全部载入内存。这个时候,我们可以从辅助存储空间(比如硬盘)中每次读入一个数字,根据GetLeastNumbers的方式判断是不是需要放入容器leastNumbers即可。这种思路只要求内存能够容纳leastNumbers即可,因此它最适合的情形就是n很大并且k较小的问题。2 人
  37. 面试题32:从1到n整数中1出现的次数2 人
  38. 面试题34:丑数2 人
  39. 根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此我们可以创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2、3或者5得到的。2 人
  40. 面试题36:数组中的逆序对2 人
  41. 面试题38:数字在排序数组中出现的次数2 人
  42. 既然输入的数组是排序的,那么我们很自然地就能想到用二分查找算法。2 人
  43. 面试题39:二叉树的深度2 人
  44. 面试题41:和为s的两个数字VS和为s的连续正数序列2 人
  45. 我们先在数组中选择两个数字,如果它们的和等于输入的s,我们就找到了要找的两个数字。如果和小于s呢?我们希望两个数字的和再大一点。由于数组已经排好序了,我们可以考虑选择较小的数字后面的数字。因为排在后面的数字要大一些,那么两个数字的和也要大一些,就有可能等于输入的数字s了。同样,当两个数字的和大于输入的数字的时候,我们可以选择较大数字前面的数字,因为排在数组前面的数字要小一些。2 人
  46. 题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。2 人
  47. 面试题44:扑克牌的顺子2 人
  48. 面试题45:圆圈中最后剩下的数字2 人

喜欢「剑指Offer」的人也喜欢