国内IT企业常见面试题

一、算法和数据结构

1、介绍红黑树

       平衡查找树的一种,保证在最坏情况下,基本的动态集合操作时间为O(lgn)
       红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
       性质1. 节点是红色或黑色。
       性质2. 根节点是黑色。
       性质3 每个叶节点是黑色的。
       性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
       性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。


2、在杨氏矩阵中查找一个数

       方法一:从坐标(1,m)开始查找,如果要查找的数比当前的数大,那么查找(2,m),如果小就查找(1,m-1),以此类推(大向下,小向上),时间复杂度O(n+m),空间复杂度O(1).方法二:逐行使用二分查找,时间复杂度O(n*logm),空间复杂度O(1)。方法三:对矩阵中的数进行映射,,然后直接查找,映射时间复杂度O(n*m),空间复杂度O(K),查找时空复杂度O(1)  


3、字符串ABCD,可以由字符串BCDA或者CDAB通过循环移位而得到。请编程实现以下 检测:字符串S1是否可以由字符串S2通过循环移位而得到。

       拼接两个S2,然后利用KMP算法判断S1是否出现在S2中。时间复杂度O(m+n),空间复杂度O(m)(m是S2长度,n是S1长度)。


4、在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。.


5、一个长度为n的数组a[0],a[1],...,a[n-1]。现在更新数组的名个元素,即a[0]变为a[1]到a[n-1]的积,a[1]变为a[0]和a[2]到a[n-1]的积,...,a[n-1]为a[0]到a[n-2]的积(就是除掉当前元素,其他所有元素的积)。程序要求:具有线性复杂度,且不能使用除法运算符。

       Left[i]表示a[0]到a[i-1]的乘积,Right[i]表示a[i+1]到a[n-1]的乘积,第一遍顺序扫描数组得到Left数组,第二遍逆序扫描得到Right数组,接着顺序扫描,Left[i]与Right[i]相乘得结果。


6、无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间。


二、C与C++

1、类占用字节大小与字节对齐方式

class CBase 
{ 
}; 
sizeof(CBase)=?

class CBase  
{ 
public: 
	CBase(void); 
	virtual ~CBase(void); 
private: 
	int   a; 
	char *p; 
}; 
sizeof(CBase)=?

#include<iostream.h>
class a {};
class b{};
class c:public a{
virtual void fun()=0;
};
class d:public b,public c{};
sizeof(a) = ??
sizeof(b) = ??
sizeof(c) = ??
sizeof(d) = ??
class Car
{
private:
       int nLength;
       int nWidth;
       static int sHigh;
};
Car objCar;
sizeof(objCar) = ??
       


2、new和malloc区别?delete A和delete[] A的区别

           new会调用构造函数,而malloc不会。new是运算符,而malloc是函数。delete A仅调用A[0]的析造函数,后者调用所有A[i]的析构函数。


3、static变量和方法的含义

          C++中,static变量和方法属于类而非对象,变量存储在全局变量区,初始化只能在全局区而不能在类之中。类中static方法只能操纵static成员变量或方法,而且static方法不能声明为const,没有this指针。
       C语言中,static函数作用域是整个文件,不用担心被其他文件的函数调用,而普通函数则会被调用,static函数在内存中只有一份,而非static函数每调用一次就需要维持一份拷贝。静态全局变量与非静态全局变量的区别是作用域的区别,而区别如前句。静态局部变量和非静态局部变量的区别是静态局部变量只会被初始化一次,而非静态局部变量可以被初始化多次。  


4、vector和list区别?map由什么实现?复杂度是多少?

         vector是向量是数组,list是链表,他们的区别主要就是数组和链表的区别。map底层由红黑树实现,各种操作复杂度均是logn.


5、浅复制和深复制是指什么?有什么差别?

       深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂的问题。因为当出现类的等号赋值时,会调用拷贝函数,在未定义显式拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅拷贝是可行的。但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象。     


6、什么函数不能定义为虚函数

      静态函数、构造函数、内联函数。静态和内联函数都是在编译时就确定属性,而虚函数是再运行时确定属性的。


7、什么是智能指针?

       管理类中的指针成员时有两种方式:一种是采用值型的方式管理,每个对象都保留一份指针指向对象的拷贝;另一种是智能指针,实现指针指向对象的共享。智能指针通用的实现技术是使用引用技术。


8、重载和覆盖有什么区别?

   派生类重新定义基类虚函数的做法叫做覆盖;重载就是允许在相同作用域中存在多个同名的函数,这些函数的参数表不同。重载的概念不属于面向对象编程,编译器根据函数不同的形参表对同名函数的名称做修饰,然后这些同名函数就成了不同的函数。重载的确定是在编译时确定,是静态的;虚函数则是在运行时动态确定。



三、操作系统

1、什么是进程和线程(Thread)?有何区别?进程和程序有何区别?什么是线程安全?
  进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
  进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。

       多线程运行和单线程运行结果一样,各个变量的值也和预期一样,那就是线程安全的。


2、中断和轮询的特点

       中断是指程序执行时,cpu接收到请求时暂停当前的程序执行转而执行其他程序,执行完后又转回来执行当前程序。轮询是不断查看是否有请求,有请求则执行。轮询——效率低,等待时间很长,CPU利用率不高。中断——容易遗漏一些问题,CPU利用率高。


3、什么是临界区,如何避免冲突?

       每个进程中访问临界资源的那段代码称为临界区,临界区只允许一个进程进入,遵循“空闲让进,忙则等待"原则。


4、什么是死锁?产生的原因有哪些?有哪些必要条件?

       死锁就是两个或者多个进程无限期阻塞、等待的一种僵局。产生的原因:1、系统资源不足 2、进程推进顺序非法。必要条件:1、互斥 2、不可抢占 3、请求保持 4、循环等待。


5、经常要操作的内存分为几个类别?

(1)栈区:由编译器自动分配和释放,存放函数的参数值、局部变量的值等;

(2)堆:一般由程序员分配和释放,存放动态分配的变量;

(3)全局区(静态区):全局变量和静态变量存放在这一块,初始化的和未初始化的分开放;

(4)文字常量区:常量字符串就放在这里,程序结束自动释放;

(5)程序代码区:参访函数体的二进制代码。


6、请讲述堆和栈的区别。

(1)申请方式不同。栈上由系统自动分配和释放;堆上由程序员自己申请并指明大小;

(2)栈是向低地址扩展的数据结构,大小很有限;堆是向高地址扩展,是不连续的内存区域,空间相对大且灵活;

(3)栈由系统分配和释放速度快;堆由程序员控制,一般较慢,且容易产生碎片;


7、操作系统中的进程调度策略有几种
       Linux系统按照Policy将进程分为实时进程和普通进程,普通进程使用动态优先调度,实时进程采用先来先服务、时间片轮转策略。从全部的调度策略中总结的话:FCFS、优先级、时间片轮转、多级反馈队列。



四、计算机网络

1、简述物理层、数据链路层、网络层、传输层的功能

       物理层:利用传输介质为数据链路层提供物理连接,提供透明传输。数据链路层:通过各种控制协议将源机的网络层数据可靠地传输到相邻节点。网络层:通过路由选择算法为报文或者分组通过通信子网选择合适的通路。传输层:为应用层提供端到端的服务,分为TCP和UDP。


2、简述TCP三次握手、四次握手。假如TCP连接建立时只有两次握手会怎么样?

        TCP连接地建立需三次握手,如图:

       

       TCP连接地关闭四次握手,,如图:

       

       如果只有两次握手就会出现如下情况:客户端发送了一个SYN请求给服务器,服务器收到了并且给出了一个ACK应答,但是这个应答在路上发生了堵塞,延迟了。客户端以为服务器没有收到请求,又重新发送了一个SYN建立连接请求,但是服务器已经认为连接已经建立好了。此时延迟的ACK应答到达了客户端,这样就会造成混乱


3、TCP/UDP的区别?

       (1)TCP是面向连接的、可靠数据传输协议,UDP是不面向连接的,非可靠数据传输协议;(2) 从传输速度上考虑: TCP 由于要建立连接、保证数据传输的可靠性等造成数据传输速度比较慢,UDP不需要这些,数据传输速度相对比较快;(3)从安全方面考虑,TCP的安全性能更高,UDP的安全性能比较低 (4)从传输数据的格式来比较,TCP传输的单位称为报文段,UDP传输的数据单位被称为 数据报

4、介绍ICMP协议

      ICMP是网际控制报文协议,用以使得主机或者路由器间可以发送差错或者异常报告。它是网络层协议,包括查询报文和差错报告报文。


五、数据库 

1、事务的四个特性

        原子性:事务必须是原子性的,要么全部执行,要么不执行。 一致性:事务在完成时必须保持一致状态。 隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。永久性:事务执行后,影响是永久的。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值