笔试面试知识储备

面试笔试知识储备

前言

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

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

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

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

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

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分钟,我这辈子的第一次面试。

原文地址:https://www.cnblogs.com/FudgeBear/p/7482313.html