微信

使用微信服务,更方便

职友集>程序员面试题 > 程序员面试必备文档

程序员面试必备文档

2015-10-18 06:30:01 阅读( 192 )

2146人 收藏本页

标签:程序员面试题

1.线程与进程的区别?

进程,本身不能执行,它只是一个资源的集合体,拥有地址空间,模块,内存,…
线程是真正的执行单元,一个进程如果没有线程,那么就没有存在的意义,因为不可能执行。
2.堆与栈的区别?
:全局区(static),文字常量区,栈区(stack),堆区(heap).

该节点的空间分配给程序.

3.进程间的通信方式有哪些?
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道(named pipe) :也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
# 套接字( socket ):套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
4.sizeof与strlen的区别?
① sizeof是运算符,计算数据所占的内存空间;strlen()是一个函数,计算字符数组的字符数;
② sizeof可以用类型作参数;strlen()只能用char*作参数,必须是以’/0’结束
③ 数组做sizeof的参数不退化,传递给strlen就退化为指针了;
④ sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小
5.OSI结构模型与TCP/IP结构模型分别为什么?

TCP/IP四层参考模型网络接口层-网间层-传输层-应用层
TCP/IP其中有三层对应于ISO参考模型中的相应层。ICP/IP协议族并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能.
6.static的作用?
①在函数体,个被声明为静态的变量在函数调用的过程中维持其值不变;
②在模块内(函数体外),一个被声明为静态的变量可以被模块内的所有函数访问,但不能被模块外的其他函数访问。它是一个本地的全局变量;
③在模块内,被声明为静态的函数只能被这一模块内的其他函数调用,既函数被限制在声明他的模块范围内。
7.指针和引用的区别?
① 引用必须被初始化,指针不必;
② 引用初始化后不能改变,指针可以改变所指的对象;
③ 不存在指向空值的引用,但是存在指向空值的指针。
8.二叉树的遍历?
typedef struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode;//定义二叉链表结点结构
createbintree(bintree *t)
{//输入二叉树的先序遍历序列,创建二叉链表
char ch;
if ((ch=getchar())==’ ‘)//如果读入空格字符,创建空树
*t=null;
else{
*t=(bintnode*)malloc(sizeof(bintnode));//申请根结点*t空间
(*t)->data=ch;//将结点数据ch放入根结点的数据域
createbintree(&(*t)->lchild);//建左子树
createbintree(&(*t)->rchild);//建右子树
}//end of if
}//end of creatbintree
inorder(bintree t)
{//对二叉树进行中序遍历
if (t){
inorder(t->lchild);
printf(“%c”,t->data);
inorder(t->rchild);
}//end of if
}//end of inorder
9.哈希冲突(散列表)
哈希冲突函数hv(i),用于在元素i发生哈希冲突时,将其映射至另一个内存位置。由于新产生的映射仍有可能发生冲突(即非同义词冲突),所以哈希冲突函数通常有多个。哈希冲突即关键字不同的元素被映射到了同一个内存位置,包括由同义词冲突和非同义词冲突。

10.虚函数与纯虚函数区别?
1类里声明虚函数的作用是为了能让这个函数在它的子类里面被覆盖,这样编译器就可以使用后期绑定来达到多态。纯虚函数接口,是个函数的声明而已,它要留到子类里面去实现。
②虚函数在子类里面也可以不重载,但是纯虚函数必须在子类里面去实现。通常,很多函数加上virtual修辞,虽然牺牲掉一些性能,但是增加了面向对象的多态性,可以阻止父类里面的这个函数在子类里被修改实现;
③虚函数的类继承了接口,同时也继承了父类的实现。纯虚函数关注的是接口的统一性,实现由子类完成;④带纯虚函数的类叫做虚基类。这种基类不能直接声称对象,只能被继承,并重写其虚函数后才能使用,这样的类也叫抽象类。
11.malloc和free,new与delete的使用?
delete会调用对象的析构函数,new调用构造函数。malloc与free是C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
12,表达式后缀?
二叉树的后序遍历序列.不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行不再考虑运算符的优先规则,如:2 1+3 *,即(2+1)* 3
建立一个栈S •从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符 Y”的形式计算机出结果,再压加栈S中 •如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束.
13.A.插入排序(直接插入排序,希尔排序)
直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
希尔排序: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
B.交换排序(冒泡排序,快速排序),
冒泡排序: 依次比较相邻的两个数,将小数放在前面,大数放在后面,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较,将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数.如此下去,直至最终完成排序。时间复杂度(n^2);
快速排序:设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
C.选择排序(直接选择排序,堆排序)
直接选择排序: 第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,…..,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列.
堆排序: ① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。 …… 直到无序区只有一个元素为止。
D.归并排序: 将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。设定两个指针,最初位置分别为两个已经排序序列的起始位置 .比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置.
E.基数排序: 基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数.

来自IT公司面试手册

下一篇:什么是软件重用?

上一篇:八迪科技面试题

亲~ 如果您有更好的答案 可在评论区发表您独到的见解。

您想查看更多的信息: 面试题