技术面试综合谈

ox按:前面有前辈讲到了销售等类面试,有人想看到其它类别的。我想起了这个本科同学,他
的基本情况:中国人民大学计算机本科,牛津大学计算机master。笔试百度电面google
微软,腾讯联想 ibm招商银行没有理他。最后他进了MSAR。原文如下:

http://www.buzuoshi.com/pwblog/blog.php?do-showone-itemid-25-type-blog.html

技术面试综合谈


昨天一个哥们又找到了工作,他从入学开始就一直在找工作,因此积累了很多题目
,我向他打听了很多题目之后,再加上自己最近也有一些面试,有一些总结性的感想,
于是写一下。

我觉得,按照题型的分类,主要有两种类型,一种以考察算法和思维为主,主要代
表是微软和google这样的大公司,这些面试题通常更多的关注算法的复杂度,面试者面
对新问题的思考能力,当然同时也不会不问你以往的项目经验和知识;另一种则是以考
察知识和编程经验为主,主要代表是各种大中小型应用型公司如投行类、财务系统或商
业系统类等等,这些面试题更多的关注于面试者是不是有广泛的编程知识,是不是有很
长时间的编程经验。



就地区上来说,英国除了微软google这样的大公司以外几乎都算是第二种面试方式
,中国则复杂一些,分三层,除了这两大巨头之外,还有不少规模较大的公司,如百度
、腾讯、联想之类,他们的面试题也属于算法型。接下来就是一些中等规模或偏应用的
公司如用友金蝶等,他们几乎属于知识型面试。然后一些更小的公司,他们属于知识型
面试的一个子集,他们会针对一小部分方面的知识问一些需要一定经验性的问题,比如
C中#define fun(a,b) a*b这句话造成的恶果之类。

之所以中国在整体上比较偏向于算法型,我认为是因为中国的大学计算机系绝大部
分是“计算机科学与技术”专业,他注重一个“科学”,所以从课程上来讲,会包括更
多的算法设计,编译原理,数值分析,计算机图形学,数据库原理等等理论性比较强的
课程。与此进行比较,英国的计算机类学科并不全是“科学”类,包括系统设计、软件
工程等培养应用型人才的专业,他们与计算机科学专业平起平坐。他们之间的差别并不
是每一个中国的计算机系大学生都能够分得清楚,在此我举两个比较明显的例子:

1,计算机图形学,在计算机科学专业学的是各种曲线曲面的方程,三维物体在平面上投
影的计算和光照的模型等数学性较强的内容,在软件工程专业学的则是如何利用OpenGL
,Direct3D等图形软件包来开发三维动画和空间。

2,数据库,在计算机科学专业学的是数据库系统的理论,是范式,是并发性处理和锁,
是公理系统,在软件工程系则是如何用java,asp等连接数据库,如何为一个系统设计各
种表,如何更好的掌握Oracle,Mysql之间的不同。

这两个例子应该很好的解释了计算机科学与计算机应用之间的不同。

再回到主题,面试题因此根据上述区别进行区分。接下来对于每一种类型,我写一
些此类型的典型题目。不介绍来自什么公司,因为渔总是比鱼好。

算法型:

(1)请比较冒泡排序、插入排序、快速排序、堆排序、归并排序、基数排序的时间空间
复杂度,并简略介绍他们的原理,更更超级高级的可能问你知不知道桶排序。排序永远
是算法类题目的基础,必问无疑。

(2)给你一个单链表,请把它反转过来。

(3)给你一个单链表,请你把它排序。这道题当然又是考察排序的理解了,怎样是更有
效率的算法是面试官想从面试者身上看到的。

(4)给你一个32位的数,每一位当然是0或1,请把它对称的翻转过来,即第1位互换第
32位,2<=>31等等。这也是看看面试者有什么特殊的想法。

(5)给一个数,使用最方便的方法得到它在二进制下末尾0的数目。比如12的二进制是
1100,那么末尾有2个零。

(6)什么叫做多态,如果你是语言的设计者,你怎么样来实现多态。

(6)给你一个n*n格的棋盘,每一个格子是黑的或者白的,现在有一个规则:每当你想
把一个格子变成它相反的颜色,那么相邻的格子的颜色也将变成它自己相反的颜色。那
么,给出一种算法,对于一个给定的棋盘,把它的格子全部变成白色。

(7)给你一个长度为n的整数数组,要你把1-n这n个数字随机地放进去,要保证足够随
机,并且没有任何一个数字在它自己的位置上。

(8)给你n个字符串,他们是n个单词,再给你一个长的输入字符串,请你找出有哪些单
词出现在这个输入字符串中。这个主要是考察字符串比较函数的效率。

(9)给你一个字符串,里面有大写或小写的字母,请把小写字母移动到字符串的前部,
大写字母移到尾部。

(10)给你给你n个字符串,他们是n个单词,再给你一个长的输入字符串,此字符串中
间没有分隔符,给出一种算法,用来适当的切分输入字符串,让切分后的字符串包含最
多的单词数。比如单词有car,care,ear,输入字符串是carear,那么虽然在e后切开能够
得到care,但是在e之前切开可以得到car ear两个单词,所以应该在e之前切开。

总结一下,发现算法类的题目大多都不是可以从以往的编程经验中直接得出来答案,而
是需要当场思考。当然,程序经验多的人,自然能够更快的想出来,因为做得多就必然
有过类似的题目遭遇。而且,算法题集中在数据结构、排序、贪心法、动态规划、字符
串处理领域最多。


知识型:

(1)请说出面向对象编程与面向过程编程的主要区别

(2)面向对象思想的三个主要特征

(3)c++里面的虚函数、纯虚函数分别是什么意思,有什么作用

(4)TCP协议与UDP协议有什么差别?

(5)final,finally,finalize分别干什么用的?

(6)const char *, char const *, char * const 这三个类型分别有什么不同

(7)解释一下c++里面函数参数的传值、传地址、传引用这三种类型的不同和实现方法


(8)java里面垃圾回收机制是怎么实现的

(9)网络7层协议是哪7层,请对每一层给出一个协议

(10)一段java程序如下:String s1 = "123" ; String s2 = "123" ; System.out.p
rint(s1==s2) ;请问结果是什么?

(11)给你一个输入字符串,找出里面出现次数多于1次的单词,你会怎么做?

(12)用jdbc连接了一个数据库之后,把它close(),再继续从它里面读数据,能不能读
出来?

(13)java里面,new一个线程t,有如下语句flag=true; t.start() ; flag=false
; 然后在线程t的函数内判断flag是不是false,那么结果是true还是false。

(14)c++里面多继承是怎样的?有什么坏处?

(15)java里面LinkedList和ArrayList有什么区别?

(16)哈西表是什么?你什么时候使用哈西表?有什么方式来处理碰撞?

总结一下,知识型的面试题答案几乎都来自编程的经历,编得多,项目做得多,便回答
得越好。此类型的题主要以线程、数据库、网络连接,以及c++和java的基本概念为主要
考点。


深一点的题目:

此类型的题目是属于知识型,是相对来说对语言更为熟悉的人才能更好的回答。

(1)c/c++语言中#define func(a,b) a*b有什么坏处?应该怎样做来防止它。

(2)#ifndef _H_myclass_这句话通常是为什么出现?

(3)用c语言写一个strcpy函数。这一个就是基本功的考试了,小小一个函数里面有很
多值得注意的细节。

(4)在c++中int char short long float double byte bool int* char* 这些数据类
型分别占多少位?

(5)函数指针


说到这里也差不多了,看到面试题,便能够反思一下自己到底适合做什么类型的计算机
工作者。

你可能感兴趣的:(编程,算法,面试,腾讯,中国移动)