zoukankan      html  css  js  c++  java
  • 剑指offer读书记录一

    本人有个习惯,读书(尤其是专业相关的书籍)的时候总喜欢按照目录把所有的内容摘要一遍,就像word中自动生成的目录一样,大标题,小标题,最后简要描述该部分的内容。以前都是手写记录在本子上面,现在既然都电子化了,那就也用blog这种形式记录吧。

    第二章 面试需要的基础知识

    2.1 面试官谈基础知识

          主要有语言基础知识,数据结构和算法,计算机系统基础知识等。

    • 语言基础知识主要就是跟编程语言相关的基础,C++的构造函数、析构函数,动态绑定/虚函数等问题,sizeof,宏定义,const,指针和数组,引用,字符串相关知识等等。
    • 数据结构:链表、树、栈、队列、哈希表和图等,它们的操作,如果自己编写程序,注意边界条件,特殊条件。     
    • 算法:主要是查找和排序算法,稳定性,会分析时间和空间复杂度,会把实际问题抽象后与算法联系。
    • 计算机系统基础知识:进程与线程、内存管理、文件操作、程序性能和程序安全等。
    • 设计相关知识:设计模式,UML图

    2.2 编程语言

       对于不同的语言,除了掌握语言的基本语法,还要清楚语言独有的特性,以及它们适用的范围。C/C++,java,C#,python等

    • C++

           可以参看C++ Primer,了解相关语法 。  

           面试题1:赋值运算符函数 operator=。相关考点对运算符函数,常量引用的了解,对内存泄露的理解,高级程序员还要考虑代码异常安全性的问题

    • C#  

       (之前没有学过C#,转述书中内容可能有所偏颇。)

          C#可以看成以C++为基础发展起来的一门语言,两者语法相似,但还是认识到区别。着重注意不同的语法特点,比如二者的class和struct就不一样

           面试题2:实现Singleton模式。相关知识点,单例模式的理解,C#语法的理解,如静态构造函数,对多线程编程的理解

    2.3 数据结构

        数组和字符串是最基本的数据结构,用连续内存分别存储数字和字符。链表和树中的指针,栈的遍历,队列的广度优先遍历算法。

    • 数组

      内存空间连续,时间效率高O(1),可以用数组实现简单的哈希表。动态数组,如C++的STL中的vector解决数据空间效率不高的问题,但是对时间性能有负面影响,原则是尽量减少改变数组容      量大小的次数。指针和数组的区别和联系

         面试题3:二维数组中的查找。从简单例子入手,寻找规律。

    • 字符串

      C/C++中的字符串以’'作为结尾,每个字符串都有一个额外的字符开销,注意越界情况。 常量字符串 

      面试题4:替换空格,将空格替换为“%20“。从前向后替换还是从后向前替换?

                      分析时间效率,内存覆盖问题。

    • 链表

      动态数据结构,时间效率为O(n)。单向链表,双向链表,环形链表。编写相关操作时,边界条件

      面试题5:从尾到头打印链表。输入一个链表的头结点,从尾到头反过来打印出每个节点的值。  

      • 考点:对单链表的理解,对循环、递归和栈3个相互关联的概念和理解

      二叉树的遍历方法:前序遍历,中序遍历和后序遍历。3种遍历都有递归和循环两种不同的实现方式 ,应该对遍历的6种实现方法非常熟悉。

      二叉树的特例,二叉搜索树,左子结点总是小于或等于根结点,右子结点总是大于或等于根结点。

      二叉树的另外两个特例是堆和红黑树,最大堆和最小堆。红黑树是把树中的结点定义为红、黑两种颜色,并通过规则确保从根结点到叶子结点的最长路径的长度不超过最短路径的两倍。在C++中,set,multiset,map,multimap等数据结构都是基于红黑树实现的。

      面试题6:重建二叉树,输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。

      • 考点:对二叉树前序、中序遍历的理解,分析复杂问题,并将大问题分解为小问题的能力
    • 栈和队列

       栈和队列的特点,一个后进先出,一个先进先出,虽然特点针锋相对,却也相互联系

       面试题7:用两个栈实现队列,实现队列的appendTail和deleteHead函数。

      • 考点:对栈和队列的理解,与模板相关的代码读写能力。

    2.4 算法和数据操作

        查找和排序算法。重点掌握二分查找、归并排序和快速排序,能做到随时正确、完整地写出它们的代码。很多代码都可以用递归和循环两种方式实现。 

    • 查找和排序

       查找相对比较简单,不外乎顺序查找、二分查找、哈希表查和二叉排序树查找(后两个主要考察的是数据结构而不是算法)。

       排序比查找复杂一些,需要比较插入排序、冒泡排序、归并排序、快速排序等不同算法的优劣。对排序算法一定要烂熟于心,能够从额外空间消耗,平均时间复杂度和最差时间复杂度等方面比较它们的优缺点。

       面试题8:旋转数组的最小数字。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组

      {3,4,5,1,2}为{1,2,3,4,5}的一个旋转,最小元素为1。(思路:第一种最直观,遍历数组复杂度为O(n),第二种方法利用二分查找法,时间复杂度为O(lgn))

      • 测试用例可以从三个方面考虑,功能测试,边界值测试(ALL或者NONE或者ONE的情况),特殊输入测试(NULL指针)
      • 考点:考查对二分查找的理解,考察沟通学习能力,考查思维的全面性,数组中有相同数字的情况
    • 递归和循环

       递归是在一个函数内部调用这个函数本身,而循环则是通过设置计算的初始值及终止条件,在一个范围内重复运算。递归效率低(时间和空间上),调用栈溢出。

        面试题9:斐波那契数列,写一个函数,输入n,求斐波那契Fibonacci数列的第n项。(思路:1.最直观的递归算法,效率低下时间复杂度以n的指数递增。2.循环的方法,从下往上             算,时间复杂度O(n)。3.需要用到一个数学公式,最后转换为求一个矩阵的乘方,时间复杂度O(lgn))

      • 考点:考查对递归、循环的理解和编程能力,对时间复杂度的分析能力,青蛙跳台阶问题,问题转换能力,数学建模能力
    • 位运算

        二进制的位运算五种:与,或,异或,左移和右移。

       面试题10:二进制中1的个数,请实现一个函数,输入一个整数,输出改二进制数表示中1 的个数。(思路:1.右移后&1判断是否+1,这种做法如果输入负数会陷入死循环。                  2。变换方式,让1和数&之后,左移一位,继续&判断是否该位为1。3.利用一个规律,把一个整数减1,再和原整数做&运算可以把改整数最右边的一个1变成0。)  

      • 考点:考查对二进制及位运算的理解,考查分析、调试代码的能力  

        

  • 相关阅读:
    装备购买 线性基+贪心
    花园 状压DP+矩阵快速幂
    数学作业 递推+矩阵快速幂
    石头游戏 构造+矩阵快速幂
    sumdiv 算术基本定理的推论
    huffman
    Integer 类型比较大小
    java 中的 String 相加
    Java 中的 static 关键字
    JAVA 基础
  • 原文地址:https://www.cnblogs.com/sherPur/p/4544089.html
Copyright © 2011-2022 走看看