• 笔试面试知识储备


    面试笔试知识储备

    前言

    有道无术术可求 有术无道止于术

    大企业更加看重的是求职者的基础知识以及解决问题的能力;

    小企业更注重求职者的实用性,求职者当前会什么,能给企业带来什么。

    创业型公司研发人员较少,每个研发人员都需要能够独当一面,对于个人成长是很好的锻炼机会,但身兼数职,经常加班,在专业技能上不够规范

    大型公司可以集中锻炼某项专业技能,有完善的团队、严格的规章制度等

    IT技术性人才需要有的优点:

    基本功扎实

    强烈的求知欲、有冲劲、愿拼搏

    在某个领域有比较深入的研究

    对人对事有信心

    掌握多项技能

    快速学习能力

    求精不求全

    在面试中被问到不擅长的领域时,讲出自己的理解,并直言自己这方面知识的欠缺,坦白比不懂装懂更真实更有力量

    面试需注意的问题:

    眼神交流

    语速适当:语速不要太快,放慢节奏,舒缓身心

    背景了解:企业发展历程和现状,公司理念、制度、规划,谈谈你喜欢的或你认为可以改善的方面

    选择Offer:

    选择企业的核心研发部门

    选择喜欢或擅长的专业领域

    笔试面试常见考点:

    列举处:如

    比较处

    性能优化

    算法设计和实现

    数据结构

    链表:

    单链表:当结点只包含其后继结点的信息的链表

    插入元素:

    将值为x的新节点插入到单链表的第i个结点的位置上(ai-1到ai之间)

    1. 找到ai-1的存储位置p

    2. 生成一个新节点s(数据为x)

    3. p.next = s;

    4. s.next = a;

    删除元素:

    将单链表的第i个结点删去(ai)

    1. 找到ai-1的存储位置p

    2. p.next = ai+1

     

     

     

     

    算法

    排序:https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

    选择排序 Selection Sort:

    经过第一轮比较后得到最小记录,将该记录与第一个记录的位置进行交换;

    接着对第一个记录以外的其他记录进行第二轮比较,得到的最小记录与第二个记录的位置进行交换;

    直到进行比较的记录只有一个时为止。

    O(n2)

    插入排序 Insertion Sort:

    从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中

    (从当前记录之前一个记录开始遍历,直到当前记录大于遍历的记录,所处位置即为有序排列的位置)

    直到最后一个记录插入为止。

    O(n2)

    冒泡排序 Bubble Sort:

    从第一个记录开始依次对相邻的两个记录进行比较(如需要则交换位置)

    每一轮过后,总共n个记录中最大的记录会被放在第n个位置上(第一轮为最大记录,第二轮为第二大记录...)

    O(n2)

    归并排序 Merge Sort:

    利用递归和分治技术 (Partition)将数据序列划分成越来越小的半子表

    归:递归分离:将数组折半分离最后成为只有单个元素的数组

    并:合并:将分开的数组内的元素按顺序合并成为新的数组

    第一轮:将每两个相邻的(长度为1)子序列进行归并,得到n/2个长度为2(有可能剩下多余的1个)的有序子序列;

    重复进行归并直到得到最终的一个有序序列

    时间复杂度为O(nlogn):logn趟*每趟n次比较

    快速排序 Quick Sort: http://www.sczyh30.com/posts/Algorithm/algorithm-quicksort/

    分而治之的思想

    通过一趟排序后,取一个元素(pivot),将原数列分为两部分。前一部分的所有记录小于pivot,后一部分的所有记录大于pivot。

    依次对这两部分的所有记录进行快速排序,直到所有记录有序为止。

    算法可分为三部分:

    (需要先得到基准 pivot)

    分解:将序列arr[m, n]划分成两个非空子序列arr[m, k]和arr[k+1, n]

    递归求解:递归对子序列调用快排

    合并:不需要进行多余操作

    详细过程:

     

    得到pivot后,将该pivot移动到序列最后

     

    创建小于等于区间(初始时区间长度为0)

    从第一个元素开始遍历,如果当前元素大于pivot,则进入下一元素;

    如果当前元素大于/等于pivot,则将当前数和小于等于区间的下一个元素进行交换,并让小于等于区间向右扩张一个位置。

    遍历到最后一个元素后(即pivot前一个元素),将pivot和小于等于区间的下一个元素进行交换

    结果得到小于等于区间、pivot、大于等于区间(一个完整的划分过程)-- O(n)

     

    Analysis: 当初始序列整体或局部有序时,快排性能下降退化为冒泡排序

    Worst case: 每次区间划分的结果均为一边序列为空,另一边区间仅比排序前少一项;满足条件:每次选取的pivot都是该子序列中的最值。此时需要递归(n-1)层,在第k层划分前序列长度为n-k+1, 层内需要进行n-k次比较。总次数为((n-1)+(1))*(n-1)/2,即为O(n2)。

    Best case: 每次区间划分的结果均为两个子序列长度相等或者相差1,此时递归logn层,O(nlogn)。

    Average case: O(nlogn)  在所有平均时间复杂度为O(nlogn)的排序算法中,快速排序的性能是最好的。

    空间复杂度:需要一个栈空间来实现递归。Worst case下递归树的最大深度为n,best case下递归树的最大深度为logn+1。平均复杂度空间为O(logn)。

    基准关键字 pivot:pivot的选择是决定快排性能的关键。常见两种方法:

    1. 三者取中:首尾和中间位置的记录取中值作为pivot,排序前交换序列第一个记录与pivot记录的位置。

    2. 随机:取随机数m(left<=m<=right),用n[m]作为pivot

    快速排序和归并排序的关系:

    都是基于分而治之的思想--分离、排序、合并

    分组策略不同;

    合并策略不同;

    希尔排序/缩小增量排序 Shell Sort:

    非稳定排序,直接插入排序的改进版本

    把记录按下标的一定增量进行分组,对每组进行直接插入排序;

    (插入排序中,当前元素要跟之前元素进行比较,每次跟之前一个元素进行比较,即步长为1

    而希尔排序的步长是逐渐(从大到小)调整的)

    i.e. 6 5 3 1 8 7 2 4 设初始步长为3

    第一趟: 6 5 3 作为前三个数,步长为3直接越界了,跳过

    1跳3步,与6比较,1<6,交换,再跳3步,越界,跳过

    -- 1 5 3 6 8 7 2 4

    8跳3步,与5比较,8>5,不交换,再跳3步,越界,跳过

    7跳3步,与3比较,7>3,不交换,再跳3步,越界,跳过

    2跳3步,与6比较,2<6,交换,再跳3步,与1比较,2>1,不交换,再跳三步,越界,跳过

    -- 1 5 3 2 8 7 6 4

    4跳3步,与8比较,4<8,交换,再跳3步,与5比较,4<5,交换,再跳三步,越界,跳过

    -- 1 5 3 2 4 7 6 8

    -- 1 4 3 2 5 7 6 8

    第一趟步长为3的插入排序结束了,第二趟开始,步长减小(可能是2)

    ......

    直到步长为1的经典插入排序完成。

    随着增量逐渐减少,每组包含的关键词越来越多,直到增量为1时,整个序列被分成一组。

    步长选择越优的,排序的复杂度越小;反之越复杂(越趋近于O(n2)) -- 与步长的选择直接挂钩

    增量的选取:一般初次取序列的一半为增量,以后每次减半,直到为1

    O(nlogn)

    堆排序: 

    1. 将所有元素建立成一个大顶堆;2. 将堆顶(即为最大值)与堆的最后一个元素进行交换,并将最大值脱离堆结构,作为数组的有序部分

    2. 将剩下的n-1个元素重新调整为一个大顶堆;2. 将堆顶与对的最后一个元素进行交换,得到的最值脱离堆作为数组有序部分

    3. 直至堆的大小为1

    能有效排序记录较多的数组

    最坏情况下的时间复杂度仍为O(nlogn)

     

    Java

    数据库

    操作系统

    网络

    设计模式

    代码重用,保证代码可靠性,实现代码工程化

    单例模式/单件模式/Singleton:

    保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(或不存在)。

    确保该类只有一个实例,并自行实例化,并向系统提供这个实例

     

    uniqueInstance为单例实例对象,getInstance()用于获取实例化对象

    构造函数必须为private,且必须提供一个全局访问点

    public class Test {
        private Test() {}
        private static Test uniqueInstance = new Test();
        public static Test getInstance() {
            return uniqueInstance;
        }
    }

    工厂模式

    用于实例化有大量公共接口的类,可以动态决定将哪一个类实例化,不必事先知道需要实例化哪一个类。

    需要某种对象时,只需要向工厂提出请求即可。

    简单工厂 Simple Factory

    工厂方法 Factory Method

    抽象工厂 Abstract Factory

    适配器模式

    观察者模式

    面经:

    0906完美世界牛人提前批完美X计划,这辈子第一次面试,面试官人很好很和蔼,上来让我自我介绍,之后说我游戏的项目很多,能不能做一些介绍。问了1. Unity的behavior的生命周期,表示不大清楚;2. 会不会C++,我说不会,面试官说国内学校把c++作为很重要的一门课,建议我可以学一些c++,3. c#熟悉不熟悉,回答不熟悉,因为unity的课程接触的c#;4. 其他语言如python等等的有没有做过什么项目,回答python是入学第一门学习的课程,项目的话做的是有关data processing的网站项目,然后问了我知道Python是怎么运行的吗,回答不清楚;面试官说可能国外和国内教授的课程内容不一样吧,你们偏向于实践,我大概了解你的情况了,跟别的同学相比你的项目经验非常丰富,但是我现在还不能给你面试结果,还需要比较一下其他应聘的同学,之后HR小姐姐会跟你联系。最后我问了问如果想要在游戏方面发展有什么建议吗: 需要学习的方向:GC  c++ 基础概念 特性 模型 渲染流程 熟悉机制;游戏方面:北京广州公司手游unity ;网易偏向python。全程29分钟,我这辈子的第一次面试。

  • 相关阅读:
    欧拉工程第53题:Combinatoric selections
    540A: Combination Lock
    540C: Ice Cave
    540B :School Marks
    欧拉工程第52题:Permuted multiples
    欧拉工程第51题:Prime digit replacements
    C. Tourist's Notes
    B. Quasi Binary
    [LeetCode] Longest Substring Without Repeating Characters
    [hihoCoder] 后序遍历
  • 原文地址:https://www.cnblogs.com/FudgeBear/p/7482313.html
Copyright © 2020-2023  润新知