美文网首页
剑指offer

剑指offer

作者: VickyShen | 来源:发表于2019-06-11 14:00 被阅读0次

    一、面试的流程

    1.1 面试官说

    1.初级程序员,偏重考察算法和数据结构,基本功;高级程序员,关注专业技能和项目经验。
    2.面试前要做好准备,对公司近况、项目情况有所了解,体现热情,要准备合适的问题
    3.不要过于紧张,解决问题,首先要清除要解决的问题,开始做一些整体的设计和规划,写完以后要自己review,并借助一些测试用例来走几遍代码,找出可能的错误

    1.2 面试形式

    电话面试

    • 电话面试,可能搞突袭,在投出简历的一两个星期内,要保证手机电池至少连续通话一个小时。
    • 要尽量用形象化的语言把细节讲清楚。
    • 听不清或者听不懂,要大胆pardon

    共享桌面远程面试

    • 看中编程习惯和调试能力
    • 良好的编程习惯包括 1、思考清楚再开始编码 2、良好的代码命名和缩进习惯 3、能够单元测试

    现场面试

    • 规划路径、估算出行时间
    • 得体衣服
    • 注意面试邀约里的面试流程,如果很长可带提神饮料
    • 准备几个问题

    1.3 面试环节

    行为面试

    5-10min,是一个warm up。
    应聘者可以利用这几分钟调整自己的情绪,进入面试的状态。

    • 自我介绍
      最开始最有个自我介绍,30min-1分钟介绍自己的主要学习、工作经历即可。
      面试官会对照简历去详细了解他感兴趣的项目。
    • 项目经验
      应聘者在准备简历的时候,需要根据STAR模型描述自己经历过的每一个项目
    1. Situation 项目的背景:项目的规模、开发软件的功能、目标用户
    2. Task 自己完成的任务:注意如果只是参与了,不要用“负责”二字。
    3. Action 为了完成任务,自己做了哪些工作,是怎么做的。这里可以做详细介绍。比如我要面开发,要将基于什么工作在哪个平台下应用了哪些技术。
    4. Result 自己的贡献:最好能用数字说明,如果参与了功能开发,可以说按时完成了多少功能;如果是优化,可以说性能提高百分之多少
      除此之外,常问的问题包括:
      在项目中遇到的最大问题是什么,你是怎么解决的。
      从这个项目中你学到了什么
      什么时候会和其他团队成员有什么样的冲突,你们是解决冲突的。
      tips:在面试时,在介绍项目经验是,不必详细描述项目的背景,而是要突出自己完成的工作和取得的成绩。
    • 应聘者掌握的技能
      要注重“了解”、“熟悉”、“精通”的区别。
      “了解”是对一个技术知识上过课或者看过书,但是没有做过实际的项目。一般不建立在简历中列出知识付钱了解过的技能,除非这个技术应聘的职位的确需要。
      简历中,我们描述的技能的掌握程度大部分应该是“熟悉”。在实际项目中,使用一项技术有较长的时候,能够通过查阅文档独立解决大部分问题,我们就熟悉它了。对于毕业应届生而言,毕设所用到的技能,可以用“熟悉”,对于已经工作的,在项目开发过程中所用到的的技能,可以用“熟悉”
      精通:使用一项技术得心用手,在项目开发中,当同学同事向我们请教这个领域的问题我们也有信心、有能力去解决,才可以说是“精通”。不要充大说精通,本领大不到家会适得其反。
    • 为何跳槽
      应届生可能用不到,也许会和问为什么不要去实习过的单位吧。
      避免提到老板太苛刻、同事难相处、加班太频繁、工资太低。
      笔者给我的答案四,现在的工作做了一段时间,已经没有太多激情了,因此需要寻求一份更有挑战的工作。需要具体论述为什么有些眼圈现在的支委,以及面试的支委我为什么有兴趣等。

    技术面试

    技术面试,一般占据一小时的面试的40-50min。
    是面试的重头戏。
    应聘者的5种素质:
    1. 基础知识扎实全面

    • 编程语言的熟练程度
    • 数据结构,熟练掌握链表、树、栈、队列、哈希表等数据结构和它们的操作。很多面试管喜欢问链表(插入、删除)、树(遍历)的问题。
    • 查找和排序算法,重点掌握二分查找、归并排序、快速排序。少数公司要求熟练掌握动态规划和贪婪算法。
      2. 能写出正确、完整、鲁邦的高质量代码
    • 面试官会格外关注边界条件特殊输入(null、空字符串)错误处理等看似细枝末节但实则至关重要的地方,来考察应聘者是否注重代码质量。
    • 解决以上问题的最好办法就是在动手写diamante之前想好测试用例,只有把各种可能的输入实现都想好了,才能在写代码的时候把各种情况做相应的处理。
    • 写完代码中,也不要立刻交给面试官检查,而是要在心理默默地运行,当之前的输入的测试用例是否都能得到合理的输出。
    • 简单的问题,一定要注重细节,写出完整、鲁棒的代码
      3. 能思路清晰的分析、解决复杂问题
      几个简单的方式帮助自己形成思路:
    • 举例让抽象问题具体化:举几个简单的例子让自己理解问题,说不准能发现抽象的规律
      -画图让抽象问题形象化: 试着用图形表示抽象的数据结构
    • 分解使复杂问题简单化:试着把复杂的问题分解成若干简单的子问题,再一一解决。许多递归的思路,包括分治法和动态规划都属此类。
      4. 能从时间、空间复杂度两方面优化算法效率
    • 如何分析效率
    • 熟悉各种数据结构的优缺点,选择合适的数据结构解决问题
    • 熟练掌握常用的算法
      5. 具备优秀的沟通能力、学习能力、发散思维能力等
    • 在面试过程中,应聘者还应该主动提问,以弄清题目的要求,表现自己的沟通能力。
    • 考察学习能力会问:最近在看什么书、从中学习到什么新技术;抛出一个新概念,观察应聘者是否能在较短的时间内理解这个新概念,并解决相关的问题。(思考、提问、再思考)
    • 知识迁移能力
      面试官会现问题各简单的问题,再问一个很复杂但是和前面简单的问题相关的问题。他期望应聘者从简单问题中得到启示。
    • 抽象建模能力和发散思维能力
      限制不得使用常规方法,考察创新能力

    应聘者提问

    最后的5-10min,至少准备1-2个问题,问的合适,是加分的好机会。
    不适合问的问题

    • 和自己的职位没有关系的问题
    • 不要问薪水,薪水是面试之后和HR谈的
    • 不要打听面试结果
      推荐问
    • 与招聘的职位和项目相关的问题
      问好这个问题首先需要对应聘的职位或者项目背景有一定的了解。两方面可以去了解:一是面试前做足功课、到网上收集一些信息,做到对公司成立时间、主要业务、职位要求都了然于胸;二是面试官说过的话,不少面试官在面试之前都会简单介绍与招聘职位相关的项目,其中会包含其他渠道无法得知的信息,比如项目进展情况,应聘者可以从中找出一两个点,然后提问

    二、面试需要的基础知识

    编程语言

    面试编程语言通常有三个类型:

    1. 面试官直接询问对某个语言的理解程度
    2. 面试官拿出事先准备好的代码,让应聘者分析代码的结果
      3.要求应聘者写代码定义一个类型或者实现类型中的成员函数

    数据结构

    1. 数组和字符串是两个最基本的数据结构
      数组-简单哈希表,时间高效
      解决空间效率不高的问题,动态数组 ArrayList

    2. 链表和树是面试中出现频率最高的数据结构,要留意代码的鲁棒性
      要熟练掌握树的前序遍历、中序遍历、后序遍历、层序遍历、二叉搜索树、堆、红黑树。
      栈是一个与递归紧密相关的数据解耦
      队列和广度优先算法遍历相关

    算法和数据结构

    重点掌握二分查找、归并排序和快速排序。
    递归和循环:很多算法都可以用递归和循环两种方式来实现。递归的实现方式代码会比较简洁,但是性能不如基于循环的实现方式(由于函数调用自身,而函数调用是有时间和空间消耗的;每一次函数调用,都要在内存栈中分配空间以保存参数、返回地址即临时变量,而且往栈中压入和弹出数据都需要时间。)。在面试的时候,可以根据题目的特点,甚至是与面试官进行讨论来选择。
    位运算是一种特殊的算法,总共有与、或、抑或、左移、右移5种位运算。

    如果面试题要求在排序的数组中查找一个数字或者某个数字的统计次数,都可以尝试二分查找
    二分查找的循环实现

        int binarySearch(int[] nums, int target) {
            int left = 0;
            int right = nums.length - 1; // 注意
    
            while(left <= right) {
                int mid = (right + left) / 2;
                if(nums[mid] == target)
                    return mid;
                else if (nums[mid] < target)
                    left = mid + 1; // 注意
                else if (nums[mid] > target)
                    right = mid - 1; // 注意
            }
            return -1;
        }
    

    二分查找的递归实现

       public static int search(int[] nums, int target) {
            return search(nums,0,nums.length-1,target);
        }
    
        public static int search(int[] nums, int start, int end, int target) {
            int min = start;
            int max = end;
            int mid = (min + max) / 2;
            while (min < max) {
                if (nums[mid] == target) {
                    return mid;
                }else if(nums[mid]<target){
                    return search(nums,mid+1,max,target);
                }else {
                    return search(nums,min,mid-1,target);
                }
    
            }
            return -1;
        }
    

    哈希表和二叉排序树的考察重点在于数据结构而不是算法

    • 哈希表的最主要优点是我们利用他查找数据O(1)的时间复杂度,是最高效率的查找方式,缺点在于需要额外的空间。
    • 二叉排序树算法对应的数据结构是二叉搜索书。
    • 关于排序,面试官会要求应聘者比较插入排序、冒泡排序、归并排序、快速排序等不同算法的优势,要求我们能从额外空间消耗、平均时间复杂度、最差时间复杂度等方面去比较

    三、高质量的代码

    3.1 代码的规范性

    规范代码书写清晰
    规范的代码布局清晰
    规范的代码命名

    3.2 代码的完整性

    在编码之前,要先考虑测试用例:普通功能测试的测试用例、边界值的测试用例、各种可能出错的测试用例
    有三种错误处理方式:

    • 返回值:把错误信息传递给函数调用者。缺点是不能发变得使用计算结果
    • 全局变量:设定一个全局变量,如果运行出错,则设置这个全局变量。缺点是,在调用出错的时候忘记做相应的错误处理,容易留下隐患
    • 异常:运行出错,则抛出异常。优点是逻辑清晰明了,缺点是有些语言不支持异常。
      注意,由于计算机表示小数(包括float和double型的小数)都有误差,所以不能直接用==判断两个小数是否相同。应当:如果两个小数的差值很小,就可以认为他们是相等的。
      细节:右移运算符代替除以2;左移代替乘以2;a&0x1代替区域。位运算比乘除法及求余操作效率高很多。

    四、面试中的各项能力

    1. 沟通能力

    • 无论是介绍项目经验还是介绍解题思路的时候,都需要逻辑清晰明了,语言详略得当,重点突出,观点明确。
    • 知之为知之,不知为不知,对于不清楚的知识点,要勇敢承认,不要不懂装懂
    • 外企,要注意提高自己的英文交流能力。

    2.学习能力

    两种方式考察应聘者的学习能力。
    第一种方法是询问应聘者最近在看什么书或者在做什么项目,从中学习到了什么新技术。---从而了解其学习的愿望和学习能力。
    第二种时抛出一个新概念,看应聘者能不能在较短时间内理解这个新概念并解决相关的问题。面试官期待应聘者能够通过思考、提问、再思考的过程,理解它们并最终解决问题。

    3.善于学习、沟通的人也善于提问。

    相关文章

      网友评论

          本文标题:剑指offer

          本文链接:https://www.haomeiwen.com/subject/efpffctx.html