《剑指offer》笔记-第6章(1)

来源:互联网 发布:nokia n8软件下载 编辑:程序博客网 时间:2024/05/18 01:59

第6章面试中的各项能力

6.1面试官谈能力

    沟通能力:礼貌平和、不卑不亢、逻辑清晰、详略得当地表达;发现问题并主动发问;

    学习能力: 对做过的项目了解深入;对面试题快速寻找解决方法;

    考查沟通能力:介绍过往项目;讲解设计思路和代码;

    考查学习能力: 提问没有接触过的问题;看书;关注什么;得到暗示后迅速做出反应并纠正;

6.2沟通能力和学习能力

    沟通能力:

        表达要逻辑清晰明了、语言详略得当

        不清楚的知识点用于承认,忌不懂装懂

        若要加入外企,提高英文交流能力,重点提高听力

    学习能力:

        询问最近看什么书、做什么项目、从中学到哪些新技术

        抛出新概念如丑数,考查能否快速理解并应用新概念

        不把问题描述清楚,考查是否能主动发问了解问题

        针对面试题主动提出高质量的问题,展示沟通和学习能力

6.3知识迁移能力

    考察方式:

        把经典的问题做变换,期待应聘者将经典问题的思路迁移过来

        先问一个简单的问题,再追问相关的复杂问题,期待应聘者将前者的思路迁移过来

    平时准备:

        总结每一道面试题的解法的特点,总结可应用到同类题目的思路

 

面试题53:在排序数组中查找数字

题目一:实现函数:输入一个数组和一个数字,求出数字在排序数组中出现的次数。

测试用例:

     功能测试:数组中包含/不包含要查找的数字;

                       数组中要查找的数字出现一次/多次      

    边界测试:查找数组中的最大值、最小值;数组中只有一个数字;

    特殊输入:数组中只有一个数字;输入数组是null;

分析:

    1.    若用二分查找,找到目标数字k,可能k的前面或后面也是k,于是在k处向左右两边顺序扫描,找到第一个和最后一个k。这种方法,时间复杂度是O(n)(有n个数,k可能出现n次),和直接从头到尾扫描一样。

    2.    关键问题是如何找到第一个和最后一个k,用二分法找;

    3.    找第一个k:如果数组中间的数字比k小,则第一个k在数组后半部分;如果数组中间的数字比k大,则第一个k在数组的前半部分;如果数组中间的数字等于k,如果k前面一个数字也是k,则那么第一个k在数组前半部分,否则数组中间的数是第一个k;

    4.    找最后一个k:如果数组中间的数字比k小,则第最后一个k在数组后半部分;如果数组中间的数字比k大,则第最后一个k在数组的前半部分;如果数组中间的数字等于k,如果k后面一个数字也是k,则那么第一个k在数组后半部分,否则数组中间的数是第最后一个k;

    5.    找到第一个和最后一个k后,根据其下标计算出k出现的次数;

    6.    这种方法的时间复杂度是O(logn)

 

题目二:找出0~n-1中缺失的数字:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1内,在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,找出这个数字。

测试用例:

      功能测试:缺失0;缺失n-1;缺失中间的数;

      边界测试:n=1,数组中只有0或1;

      特殊输入:输入数组是null;

分析:

    1.    利用数组是排序的这一条件,如果缺失m,则m之前的数字和其下标相等,从m开始数字和下标不等;

    2.    利用二分法:如果中间元素和下标相等,则查找后半部分;如果中间元素和下标不等,若前一个元素和下标相等,则中间元素是第一个数字和下标不等的元素,中间元素下标是缺失的数字;如果中间元素和下标不等,若前一个元素和下标不等,则查找前半部分;

 

题目三:数组中数值和下标相等的元素:在一个单调递增的数组中,每个元素唯一,找出数组中任意一个数值和下标相等的元素。如{-3,-1,1,3,5},数字3和其下标相等。

测试用例:

      功能测试:数组中不存在/存在数值和下标相等的元素;

      边界测试:数组中只有一个元素;数值和下标相等的元素位于数组的开头/结尾;

      特殊输入:输入数组是null;

分析:

    1.    如果第i个数字的值大于i,则它右边的数字都大于对应的下标;如果第i个数字的值小于i,则它左边的数字都小于对应的下标;

    2.    二分查找:如果数组中间的数字大于i,则查找左边的数字;如果数组中间的数字小于i,则查找右边的数字;如果数组中间的数字等于i,则找到该数字;

 

二分查找可用于在排序数组中查找特定的数字

原创粉丝点击