面经中高频知识点归纳(二)
前言:
经历过热火朝天找暑期实*的*两个月,大家看起来都忙忙碌碌,好不充实!而陡然回首发现自己并没想象中那么充实,虽然每周在向老板汇报着学校的主数据管理项目,学*着一些新的东西(主要是java方面),还算有些收获,可是慢慢发现总感觉缺少了些什么东西,到底是什么原因呢?
1、可能最*学*java的精力投入的比较多,而自己之前主要是搞c++的,这种分心给我带来了一定的茫然感,需要平衡!
可能的解决方法:学*java的同时不能丢掉c++的老本,结合java语言来看c++或许能带来更好的理解,需要克服,能一心多用到融汇贯通,加油!
2、也许是最*没怎么参加面试,没有之前不断刷题->夯实基础->积累笔经&面经的那股充实劲了而觉得不在状态
可能的解决方法:每天还是要抽出点时间来刷题或夯实基础,不能真实去面试积累经验也可以通过看看别人好的面经来弥补下!
参考文章:(来源于牛客网)
来说说我暑期找实*的事儿吧(搜狗、百度、网易等公司电面面经)
计算机网络&操作系统相关:
1、分析下打开www.baidu.com网站的所有过程
2、socket通信过程
3、说说操作系统中,堆和栈的区别是什么?
4、听说你了解操作系统,来说说linux系统启动后内存分配是咋样的吧?
参考答案:http://blog.sina.com.cn/s/blog_6d50a05801017d34.html
http://www.cnblogs.com/leaven/archive/2010/12/03/1895134.html
5、进程和线程的区别是什么?
参考答案:(仅仅是教科书般的回答是不够的,最好结合你实际使用去回答,说出这两者的区别)
(1)进程是系统进行资源分配的基本单位,有独立的内存地址空间; 线程是CPU调度的基本单位,没有单独地址空间,有独立的栈,局部变量,寄存器, 程序计数器等。
(2)创建进程的开销大,包括创建虚拟地址空间等需要大量系统资源; 创建线程开销小,基本上只有一个内核对象和一个堆栈。
(3)一个进程无法直接访问另一个进程的资源;同一进程内的多个线程共享进程的资源。
(4)进程切换开销大,线程切换开销小;进程间通信开销大,线程间通信开销小。
(5)线程属于进程,不能独立执行。每个进程至少要有一个线程,成为主线程
6、锁是什么,死锁是什么一回事?
参考答案:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。
产生死锁的原因:
(1)因为系统资源不足。
(2)进程运行推进的顺序不合适。
(3)资源分配不当。
产生死锁的条件有四个:
(1)互斥条件:所谓互斥就是进程在某一时间内独占资源。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
7、你对网络了解?那你说一下HTTP是有状态的还是无状态的?为什么?
参考答案:HTTP是无状态的协议。什么是无状态和有状态。这个可以在网络的相关概念中找到。有状态是指下次传输能够“记住”这次传输的能力。而HTTP每次传输都得重新建立链接。
8、说一下Session和Cookie的区别?现在主流的服务器使用的是哪个?
参考答案:Session是将用户提交的信息存储在服务器上。Cookie是将用户的信息存储在本地。第二个问题我不太清楚。面试官说,现在流行用Cookie,因为使用Session的话对服务器的开销很大。
(其他参考)
9、说一下HTTP的两种方法?有什么区别?
参考答案:get和post方法。两者的区别就是地址栏里,利用get获得的参数会显示在地址栏,post则不会。post传输的数据量更加大一些。后来面试官出了 一个题目,大概意思是说地址栏中的参数值是1,而表单里面的参数值是2,分别用get和post提交,提交后的参数值是多少?
10、进程间通信有哪几种方式?(我说了管道、共享内存、信号量等)说一下管道的原理是什么?线程的通信方式是什么?
11、epoll,select听说过吗
数据结构与算法相关:
1、说一下数据结构中,栈的实现方式?队列的实现方式?
回答这个问题,首先要知道栈的数据结构,很多人都知道栈是先进后出的数据结构。但是不知道具体怎样实现的。就比如说你需要知道栈定义的结构体是怎样,然后才好说操作是怎样的。我主要说了一下pop和push的操作。队列的问题也是一样去回答,入队和出队操作是怎样的。
参考答案:待补充!
补充:说说你对栈的理解?(今天自己携程电话面试被问到了,一说栈大家其实大概知道是什么东西,但是要将其解释清楚还需要结合使用场景进行描绘)
参考答案:栈,是硬件,主要作用表现为一种数据结构,是只能在一端插入和删除数据的特殊线性表。允许进行插入和删除操作的一端称为栈顶,另一端为栈底。栈按照后进先出的原则存储数据,最先进入的数据被压入栈底,最后进入的数据在栈顶,需要读数据时从栈顶开始弹出数据。栈底固定,而栈顶浮动。栈中元素个数为零时称为空栈。插入一般称为进栈(push),删除则称为出栈(pop)。栈也被称为先进后出表,在函数调用的时候用于存储断点,在递归时也要用到栈。
在计算机系统中,栈则是一个具有以上属性的动态内存区域。压栈的操作使栈顶的地址减小,弹出的操作使栈顶的地址增大。 栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常被称为堆栈帧。栈一般包含以下两方面的信息:
(1)函数的返回地址和参数。
(2)临时变量:包括函数的非静态局部变量及编译器自动生成的其他临时变量。
参考答案:可以选择一种或几种排序算法,然后叙述一下排序过程以及对时间复杂度和空间复杂度进行分析!
待补充!
3、有这样一个序列,先增后减,从这个序列中找出最大数?
参考答案:借鉴二分查找的思想。首先取中间数,再取中间左边一个数和右边一个数,如果这个中间数比左右两边都大,那么它就是最大数;否则,如果左边数<中间 数<右边数,那么取右边的那段序列,重复二分查找再取中间数;如果左边数>中间数>右边数,那么取左边那段序列,重复二分查找取中间数。
4、有一个无序数组,从中找出第K大的数?
参考答案:这个问题我首先想到的一个是《编程珠玑》上的一个方法。如果这个问题对空间没有限制,那么可以申请与原来数组一样大小的数组空间,这个数组空间是有序的, 比如说从1到n。然后遍历一遍那个无序的数组,将数字填写到对应位置中去。例如,3填写到3位置,5填写到5位置。那么整个遍历过程是O(n)时间,而且 我相当于把失序的数组再排序了一遍。找到第K大元素只要O(1)时间就行了,所以复杂度是O(n)。面试官听了以后,感觉可以。但是又不是他想要的答案, 他说你听说过快排没有?我说听说过,他说你可以从这个里面借鉴一下。这个方法百度一下就有,此处略。
参考答案:这个问题本质上是找出两个链表中的第一个不同元素。首先,用树的遍历找出含有这两个子节点的两条路径。两条路径其实两个链表。然后,找出第一个不同的元素即可。这个元素前面的元素就是相同的元素,也就是第一个公共父节点。
6、给你一个数学表达式,例如1*2+3/4,请说一下你怎么进行处理来得到计算结果?
C/C++相关:
C没有类,有类似的结构体
C++ 类就是一种抽象,就好比人类,是一个类,人类具有某些特性,对象是按照这个抽象实际创造出来的东西
3、听说你懂C,来说一下memcpy的缺陷是啥?
参考答案:
Java有关: