部分真题整理

来源:互联网 发布:淘宝仓库配货员累吗 编辑:程序博客网 时间:2024/05/01 21:25

① NLR:前序遍历(PreorderTraversal亦称(先序遍历))
——访问根结点的操作发生在遍历其左右子树之前。
② LNR:中序遍历(InorderTraversal)
——访问根结点的操作发生在遍历其左右子树之中(间)。
③ LRN:后序遍历(PostorderTraversal)
——访问根结点的操作发生在遍历其左右子树之后。
1、已知一棵二叉树,如果先序遍历的节点顺序是:ADCEFGHB,中序遍历是:CDFEGHAB,则后序遍历结果为:(D)
CFHGEBDA
CDFEGHBA
FGHCDEBA
CFHGEDBA


2、初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为:(A)
8 3 2 5 1 6 4 7
3 2 8 5 1 4 6 7
3 8 2 5 1 6 7 4
8 2 3 5 1 4 7 6
初始化序列:1 8 6 2 5 4 7 3,,小根堆就是要求结点的值小于其左右孩子结点的值,左右孩子的大小没有关系,那么小根堆排序之后为:1 2 4 3 5 6 7 8;
中序遍历:先遍历左孩子,然后访问根结点,最后访问有孩子,故遍历结果为:8 3 2 5 1 6 4 7


3、IP地址131.153.12.71是一个(B)类IP地址。
IP地址分类 A类网络的IP地址范围为1.0.0.1-127.255.255.254;
B类网络的IP地址范围为:128.1.0.1-191.255.255.254;
C类网络的IP地址范围为:192.0.1.1-223.255.255.254。
子网划分:




4、下推自动识别机的语言是:(C)
0型语言
1型语言
2型语言
3型语言
在编译原理中,图灵机(TM)识别0型语言
线性界限自动机(LBA)识别上下文有关语言
下推自动机(PDA)识别上下文无关语言
有穷自动机(FA)识别正规语言


5、浏览器访问某页面,HTTP协议返回状态码
找不到该页面:404
禁止访问:403
内部服务器访问:500
服务器繁忙:503


6、如果某系统15*4=112成立,则系统采用的是(A)进制。
6
7
8
9
需要注意的是,当选定六进制时,15,4 和112都应该为六进制。
15由六进制转为十进制为11,计算方法:1*6 + 5*1 = 11
同理:4转为十进制为4,112转为十进制为44 所以转换后的等式左边为 11*4, 右边为44。相等。
所以,答案为A。
假设是X进制 则:(x+5)*4 = x*x +x +2
求解得:x = 6


7、一个栈的入栈序列是A,B,C,D,E,则栈的不可能的输出序列是?(C)
EDCBA
DECBA
DCEAB
ABCDE
选项A:压入ABCDE,再依次弹出
选项B:压入ABCD,弹出D,压入E,弹出E,再弹出CBA
选项C:不可能
选项D:压入X,弹出X


8、进程进入等待状态有哪几种方式?
CPU调度给优先级更高的线程
阻塞的线程获得资源或者信号
在时间片轮转的情况下,如果时间片到了
获得spinlock未果
A CPU调度给优先级更高的线程(运行态转为就绪态)
B 阻塞的线程获得资源或者信号(阻塞态转为就绪态)
C 在时间片轮转的情况下,如果时间片到了(运行态转为就绪态)
D 获得 spinlock 未果(运行态转为阻塞态)


9、下列哪两个数据结构,同时具有较高的查找和删除性能?()
有序数组
有序链表
AVL树
Hash表
解析:几种常见的数据结构的操作性能对比如下图所示

由上图可见,平衡二叉树的查找,插入和删除性能都是O(logN),其中查找和删除性能较好;哈希表的查找、插入和删除性能都是O(1),都是最好的。
答案:CD


10、下列排序算法中,哪些时间复杂度不会超过nlogn?(B、C)
快速排序
堆排序
归并排序
冒泡排序
解析:几种常见的排序算法对比:
排序法 平均时间 最差情形 稳定度 额外空间 备注
冒泡 O(n2) O(n2) 稳定 O(1) n小时较好
交换 O(n2) O(n2) 不稳定 O(1) n小时较好
选择 O(n2) O(n2) 不稳定 O(1) n小时较好
插入 O(n2) O(n2) 稳定 O(1) 大部分已排序时较好
基数 O(logRB) O(logRB) 稳定 O(n) B是真数(0-9),
R是基数(个十百)
Shell O(nlogn) O(ns) 1<s<2< span=""></s<2<> 不稳定 O(1) s是所选分组
快速 O(nlogn) O(n2) 不稳定 O(nlogn) n大时较好
归并 O(nlogn) O(nlogn) 稳定 O(1) n大时较好
堆 O(nlogn) O(nlogn) 不稳定 O(1) n大时较好
稳定的排序:冒泡,插入,基数,归并



11、Unix系统中,哪些可以用于进程间的通信?(ABCD)
Socket
共享内存
消息队列
信号量
A socket可以实现同一个主机的进程之间通信,也可以实现不同的两台主机之间的不同进程的通信。
B 申请一块内存,不同的进程都可以使用,使用的时候,最好加锁
C 消息队列是可以实现的
D 信号量semget函数可以实现进程通信。


13、 TCP和IP分别对应了OSI中的哪几层?()



14、 同一进程下的线程可以共享以下?
解析: 线程共享的内容包括:
1.进程代码段
2.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)
3.进程打开的文件描述符、
4.信号的处理器、
5.进程的当前目录和
6.进程用户ID与进程组ID
线程独有的内容包括:
1.线程ID
2.寄存器组的值
3.线程的堆栈
4.错误返回码
5.线程的信号屏蔽码



15、如何减少换页错误?(B)
进程倾向于占用CPU
访问局部性(locality of reference)满足进程要求
进程倾向于占用I/O
使用基于最短剩余时间(shortest remaining time)的调度机制
换页错误又称缺页错误,当一个程序试图访问没有映射到物理内存的地方时,就会出现缺页错误, 这时操作系统就要去虚拟内存中加载这块内存页。
百度了一下,减少换页错误的方法,即降低缺页中断率:
1、内存页框数。增加作业分得的内存块数。
2、页面大小。页面划分越大,中断率越低。
3、替换算法的优劣影响缺页中断次数
4、程序局部性。程序局部性好可减少缺页中断(为什么?)。
那么B是对的,而对于D,最短剩余时间调度是CPU调度就绪进程的方式,与页面置换算法无关,不要搞混淆了。


16、同步机制应该遵循的基本准则
• 空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态,允许一个请求进入临界区的进程立即进入临界区,以有效利用临界资源
• 忙则等待:当已有进程处于临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问
• 有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态
• 让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态


17、设有字母序列{Q,D,F,X,A,P,N,B,Y,M,C,W},请写出按二路归并方法对该序列进行一趟扫描后的结果为 1 。(输出结果请按照以下格式:ABCDEFG,字母之间没有逗号)
DQFXAPBNMYCW


18、关键码序列(Q,H,C,Y,Q,A,M,S,R,D,F,X),要按照关键码值递增的次序进行排序,若采用初始步长为4的Shell的排序法,则一趟扫描的结果是 1 ;若采用以第一个元素为分界元素的快速排序法,则扫描一趟的结果是 2 。
1:QACSQDFXRHMY
2:MHCFDAQSRQYX


19、二进制地址为011011110000,大小为(4)10和(16)10块的伙伴地址分别为
假设地址是16位的,
(011011110000)2
=(0000 0110 1111 0000)2
=(06F0)16>06F0h
所以当前地址为06F0h
查阅相关资料,有:
伙伴的概念, 满足以下三个条件的称为伙伴:
( 1 ) 两个块大小相同
( 2 ) 两个块地址连续
( 3 ) 两个块必须是从同一个大块中分离出来的。
若块大小为4,则06F4h是06F0h的伙伴地址。
若块大小为16,则06E0h是06F0h的伙伴地址。


20、TCP/IP协议栈的网络层的主要功能是通过(A )来完成的。
IP协议
TCP协议
以太网协议
IGP协议
网络层是IP协议
TCP协议是传输层

21、实现不同的作业处理方式(如:批处理、分时处理、实时处理等),主要是基于操纵系统对(A)治理采取了不同的策略。
处理机
存储
数据库
文件


22、下面关于编译系统和解释系统的观点中,错误的是(A)
解释程序不产生目标代码,它直接执行源程序或源程序的内部形式
使用编译系统时会区分编译阶段和运行阶段
一般来说,编译系统的比较复杂,开发和维护费用都大。相反,解释系统比较简单,可移植性好,适合于以交互形式执行程序
一般来说,建立在编译基础上的系统在执行速度上要优于建立在解释执行基础上的系统
A 不是直接执行,而是转换成机器可识别码之后才能执行


23、对于#include <filename.h> 和 #include “filename.h”,以下说法错误的是( B)
#include <filename.h>只搜索标准库路径
#include “filename.h”只搜索用户工作路径
#include <filename.h>搜索范围比#include “filename.h”小
两者可能等价
#include""从当前工作路径开始搜索,然后扩展到标准库路径。



24、类定义的外部,可以被访问的成员有(C)。
所有类成员
private或protected的类成员
public的类成员
public或private的类成员
public: 公有访问,类外部可访问;
private:私有访问,类本身成员函数可访问;
protected:保护访问,类本身以及派生子类可访问


25、 TCP/IP模型的体系结构中,ICMP协议属于( B)。
应用层
网络层
数据链路层
传输层
ICMP是TCP/IP协议族 的一个子协议,用于 传递控制消息,通常使用的PING命令就是使用这个协议。它的归属层为:网络层。


26、 下列的模板说明中,正确的有( )
template <typename T1, typename T2>
template <class T1, T2>
template <class T1, class T2>
template <typename T1; typename T2>


27、 (ACD )面向对象程序设计语言不同于其他语言的主要特点。
继承性
消息传递
多态性
封装性


28、 下面有关重载函数的说法中正确的是(C)
重载函数必须具有不同的返回值类型
重载函数形参个数必须不同
重载函数必须有不同的形参列表
重载函数名可以不同


29、在一个cpp文件里面,定义了一个static类型的全局变量,下面一个正确的描述是(A)
只能在该cpp所在的编译模块中使用该变量
该变量的值是不可改变的
该变量不能在类的成员函数中引用
这种变量只能是基本类型(如int,char)不能是C++类型
Static全局变量和普通全局变量:
针对:一个工程里有多个cpp文件时
相同点:存储方式相同,都是静态存储;
不同点:作用域不同。
普通全局变量---作用域是整个源程序(含有多个源文件),在各个源文件中都有效
Static全局变量----作用域是当前源文件


30、观察下面一段代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 class ClassA
{
public:
virtual ~ ClassA(){};
virtual void FunctionA(){};
};
class ClassB
{
public:
virtual void FunctionB(){};
};
class ClassC : public ClassA,public ClassB
{
public:
};

ClassC aObject;
ClassA* pA=&aObject;
ClassB* pB=&aObject;
ClassC* pC=&aObject;
关于pA,pB,pC的取值,下面的描述中正确的是:(C)
pA,pB,pC的取值相同.
pC=pA+pB
pA和pB不相同
pC不等于pA也不等于pB
子类的指针和第一个基类的指针应该是一样的,和第二个基类是不一样的。
pB和pA的差值是 虚函数表指针的大小,32位机器是4字节,64位机器就是8字节了


31、有如下一段代码:
1
2
3 #define ADD(x,y) x+y
int m=3;
m+=m*ADD(m,m);
则m的值为: (A)
15
12
18
58
代码展开为:m=m+m*x+y,其中x=m,y=m,所以m=15
假如将#define ADD(x,y) x+y改为:#define ADD(x,y) (x+y),则结果就又不一样了,m=m+m*(x+y)


32、在Windows编程中下面的说法正确的是:(B)
两个窗口,他们的窗口句柄可以是相同的
两个窗口,他们的处理函数可以是相同的
两个窗口,他们的窗口句柄和窗口处理函数都不可以相同.


33、下面哪种情况下,B不能隐式转换为A?(B)
class B:public A{}
class A:public B{}
class B{operator A();}
class A{A(const B&);}
拷贝构造函数可以进行隐式类型转换,operator除了表示重载外也表示隐式类型装换,子类对象可以隐式转换为父类对象,父类对象要增加数据成员必须要显示地转化为子类的对象。


34、 某公司使用包过滤防火墙控制进出公司局域网的数据,在不考虑使用代理服务器的情况下,下面描述错误的是”该防火墙能够(B )”.
使公司员工只能访问Internet上与其业务联系的公司的IP地址.
仅允许HTTP协议通过,不允许其他协议通过,例如TCP/UDP.
使员工不能直接访问FTP服务器端口号为21的FTP地址.
仅允许公司中具有某些特定IP地址的计算机可以访问外部网络


35、假设你在编写一个使用多线程技术的程序,当程序中止运行时,需要怎样一 个机制来安全有效的中止所有的线程?请描述其具体流程.
程序中的主线程向各个子线程发送一个退出消息信号,各个线程收到这个消息信号后退出线程函数,则可以安全有效的推出所有的线程。


36、下面的排序算法中,初始数据集的排列顺序对算法的性能无影响的是(B)
插入排序
堆排序
冒泡排序
快速排序
有影响就是这个排序算法最好情况和最差情况的时间复杂度不同。对于无影响,我们只要找最好情况和最差情况时间复杂度一样的算法就可以了,所以是堆排序
根据各种排序算法的流程,对于插入排序,如果几乎有序的话,每个节点的初始位置就最终位置,所以几乎不需要移动节点。
对于冒泡排序,如果节点几乎有序的话,对于一次遍历设置标记为,如果不交换元素的话即结束排序过程。
对于快速排序,如果以初始序列是逆序的话,时间复杂度变为n2.
综上,时间堆排序的最差和最优时间复杂度都为nlgn,所以堆排序是最优的
对算法 无影响的有 堆 直接选择 归并 基数 即最好 和最坏的时间复杂度都是一样的


37、数据存储在磁盘上的排列方式会影响I/O服务的性能,一个圆环的磁道上有 10 个物理块,10 个数据记录R1------R10 存放在这个磁道上,记录的安排顺序 如下表所示: 假设磁盘的旋转速度为20ms/周,磁盘当前处在R1 的开头处,若系统顺序扫描 后将数据放入单缓冲区内,处理数据的时间为4ms(然后再读取下个记录), 则处理这10 个记录的最长时间为(C)
180ms
200ms
204ms
220ms
这道题终于会做了。是这样的原理,磁盘会一直朝某个方向旋转,不会因为处理数据而停止。本题要求顺序处理R1到R10,起始位置在R1,一周是20ms,共10个记录,所以每个记录的读取时间为2ms。首先读R1并处理R1,读R1花2ms,读好后磁盘处于R1的末尾或R2的开头,此时处理R1,需要4ms,因为磁盘一直旋转,所以R1处理好了后磁盘已经转到R4的开始了,这时花的时间为2+4=6ms。这时候要处理R2,需要等待磁盘从R5一直转到R2的开始才行,磁盘转动不可反向,所以要经过8*2ms才能转到R1的末尾,读取R2需要2ms,再处理R2需要4ms,处理结束后磁盘已经转到R5的开头了,这时花的时间为2*8+2+4=22ms。等待磁盘再转到R3又要8*2ms,加上R3自身2ms的读取时间和4ms的处理时间,花的时间也为22ms,此时磁盘已经转到R6的开头了,写到这里,大家已经可以看到规律了,读取并处理后序记录都为22ms,所以总时间为6+22*9=204ms。
1. 访问R1 : 2ms , 处理 R1 :4ms ,
2. 经过 8*2ms 之后,到达 R2 头,访问 R2 : 2ms , 处理 R2 :4ms
3. 经过 8*2ms 之后,到达 R3 头, 访问 R3: 2ms , 处理 R3 : 4ms
。。。。
10 , 经过 8*2 ms 之后,到达 R10 头, 访问 R10 : 2ms, 处理 R10 :4ms
计算上述时间 :R1: 6ms , R2->R10 : (4ms +9*2ms) *9 =6+ 198 = 204ms
38、 随着IP 网络的发展,为了节省可分配的注册IP 地址,有一些地址被拿出来用于私有IP 地址,以下不属于私有IP 地址范围的是(C)
10.6.207.84
172.23.30.28
172.32.50.80
192.168.1.100
注解:私有IP地址共有三个范围段:
A:10.0.0.0~10.255.255.255 /8
B:172.16.0.0~172.31.255.255 /12
C:192.168.0.0~192.168.255.255 /16


39、下列关于一个类的静态成员的描述中,不正确的是(D)
该类的对象共享其静态成员变量的值
静态成员变量可被该类的所有方法访问
该类的静态方法只能访问该类的静态成员变量
该类的静态数据成员变量的值不可修改


40、 表达式“X=A+B*(C--D)/E”的后缀表示形式可以为(C)
XAB+CDE/-*=
XA+BC-DE/*=
XABCD-*E/+=
XABCDE+*/=
一个中缀式到其他式子的转换方法~~
这里我给出一个中缀表达式~
a+b*c-(d+e)
第一步:按照运算符的优先级对所有的运算单位加括号~
式子变成拉:((a+(b*c))-(d+e))
第二步:转换前缀与后缀表达式
前缀:把运算符号移动到对应的括号前面
则变成拉:-( +(a *(bc)) +(de))
把括号去掉:-+a*bc+de 前缀式子出现
后缀:把运算符号移动到对应的括号后面
则变成拉:((a(bc)* )+ (de)+ )-
把括号去掉:abc*+de+- 后缀式子出现
发现没有,前缀式,后缀式是不需要用括号来进行优先级的确定的。


41、 C++将父类的析构函数定义为虚函数,下列正确的是哪个?(A)
释放父类指针时能正确释放子类对象
释放子类指针时能正确释放父类对象
这样做是错误的
以上全错
C++的多态肯定是使用父类的指针指向子类的对象,所以肯定是释放子类的对象,如果不使用虚函数的话, 父类的指针就只能够释放父类的对象。


42、下列哪一个不属于关系数据库的特点?(D)
数据冗余度小
数据独立性高
数据共享性好
多用户访问


43、下面程序的输出结果为多少?(B)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Void Func(char str_arg[100])
{
printf("%d\n", sizeof(str_arg));
}
int main(void)
{
char str[] = "Hello";
printf("%d\n", sizeof(str));
printf("%d\n", strlen(str));
char *p = str;
printf("%d\n", sizeof(p));
Func(str);
}


5 4 4 4
6 5 4 4
5 5 5 5
5 5 5 4
输出结果为:6 5 4 4
对字符串进行sizeof 操作的时候,会把字符串的结束符“\0”计算进去的,进行strlen 操作求字符 串的长度的时候,不计算\0 的。 数组作为函数参数传递的时候,已经退化为指针了,Func 函数的参数str_arg只是表示一个指 针,那个100不起任何作用的。


44、 typedef char *String_t; 和#define String_d char * 这两句在使用上有什么区别?
typedef char *String_t 定义了一个新的类型别名,有类型检查。而#define String_d char * 只是做了个简单的替换,无类型检查,前者在编译的时候处理,后者在预编译的时候处理。
同时定义多个变量的时候有区别,主要区别在于这种使用方式String_t a,b; String_d c,d;a,b ,c 都是char*类型,而d 为char 类型
由于typedef 还要做类型检查。。#define 没有。。所以typedef 比#define 安全。。

45、[问答题]
已知rand7()可以产生1~7的7个数(均匀概率),利用rand7() 产 生 rand10() 1~10(均匀概率)。
int rand10()
{
int n=49;
while(n>40){
n=7*(rand7()-1)+rand7();
}
return n%10+1;
}


46、 对一个正整数作如下操作:如果是偶数则除以 2,如果是奇数则加 1,如此进行直到 1 时操作停止,求经过 9 次操作变为 1 的数有多少个?
如果逆推此题,可以知道 1 一定是由 2 , 4 变化来的(因为2不能由1得到,不纳入以下讨论)
4 之后有可能是 8 和 3,因此分支开始。
每个偶数 2n 一定能产生两个分支——由4n 除以2得到,或者2n-1得到,
每个奇数 2n-1 只能是由偶数 4n-2除以2得到,
因此每个偶数逆推一次产生一个奇数和一个偶数,每个奇数逆推一次产生一个偶数
用一个很简单的函数循环7次就可以了(从4开始算),代码如下:
void func(int& numEven, int& numOdd)
{
int e = numEven;
int o = numOdd;
numEven = e + o;
numOdd = e;
}
1
2
3
4
5
6
7
8
9
10
11
12 int main()
{
int a = 1;
int b = 0;
for ( int i = 0; i < 7; ++i )
{
func(a, b);
}
cout << a << " " << b;
return 0;
}
得到偶数21个,奇数13个,总数34个。


47、IP数据报头采用()字节序,在此字节序下从低地址到高地址0x1234的表示形式为 (C) 。
big_endian,0x12 0x34 0 0
little_endian,0x34 0x12 0 0
big_endian,0 0 0x12 0x34
little_endian, 0 0 0x34 0x12
IP数据报头采用big_endian字序列
big_endian的特点:
低字节存储在高地址位,高字节存储在低地址位
little-endian的特点:
低字节存储在低地址位,高字节存储在高地址位


48、
struct T {
char a;
int *d;
int b;
int c:16;
double e;
};
T *p;
在64位系统以及64位编译器下,以下描述正确的是
sizeof(p) == 8 P为指针,64位系统地址占8个字节
sizeof(*p) == 24 根据内存对齐 32字节 a_ _ _ _ _ _ _ | * d 8字节| | b4字节| |c2字节|_ _ |e8字节|
sizeof(p->a) == 1 正确
sizeof(p->e) == 8 double


49、平均速度最快的排序算法是?(B)
Shell排序
快速排序
冒泡排序
插入排序
shell排序的平均复杂度是O(nlogn)~O(n2),最好的情况O(n1.3),最坏的情况O(n2)
快速排序的平均复杂度是O(nlogn), 最好的情况O(nlogn),最坏的情况O(n2)
直接插入排序的平均复杂度是O(n2), 最好的情况O(n), 最坏的情况O(n2)
冒泡排序的平均复杂度是O(n2), 最好的情况O(n), 最坏的情况O(n2)

50、在N个乱序数字中查找第k大的数字,时间复杂度可以减小至(B)
O(N*logN)
O(N)
O(1)
O(2)
51、设集合A={1,2,3},A上的关系R={(1,1),(2,2),(2,3),(3,2),(3,3)},则R不具备 (D)?
自反性
传递性
对称性
反对称性
假设集合A,以及基于A上的关系R
自反: 如果a是A的元素,那么<a,a>是R的元素
反自反: 如果a是A的元素,那么<a,a>不是R的元素
对称:如果<a,b>是R的元素,那么<b,a>是R的元素
反对称:如果<a,b>,<b,a>是R的元素,那么a,b相等
传递:如果<a,b>,<b,c>是R的元素,那么<a,c>是R的元素


52、主机甲和主机乙间已建立一个TCP连接,主机甲向主机乙发送了两个连续的TCP段,分别包含300字节和500字节的有效载荷,第一个段的序列号为200,主机乙正确接收到两个段后,发送给主机甲的确认序列号是?
500
700
800
1000
确认序列号=原始序列号+TCP段的长度,所以第一次的确认序列号为200+300=500,第二次确认序列号为500+500=1000,选D。


53、将一个从大到小的数组,用以下排序方法排序成从小到大的,(D)最快。
插入排序
冒泡排序
快速排序
堆排序
排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性
冒泡排序 O(n^2) O(n) O(n^2) O(1) 稳定
选择排序 O(n^2) O(n^2) O(n^2) O(1) 稳定
插入排序 O(n^2) O(n) O(n^2) O(1) 稳定
希尔排序O(n*log(n))~O(n^2) O(n^1.3) O(n^2) O(1) 不稳定
堆排序 O(n*log(n)) O(n*log(n)) O(n*log(n)) O(1) 不稳定
归并排序 O(n*log(n)) O(n*log(n)) O(n*log(n)) O(n) 稳定
快速排序 O(n*log(n)) O(n*log(n)) O(n^2) O(1) 不稳定
冒泡排序经过优化以后,最好时间复杂度可以达到O(n)。设置一个标志位,如果有一趟比较中没有发生任何交换,可提前结束,因此在正序情况下,时间复杂度为O(n)。选择排序在最坏和最好情况下,都必须在剩余的序列中选择最小(大)的数,与已排好序的序列后一个位置元素做交换,依次最好和最坏时间复杂度均为O(n^2)。插入排序是在把已排好序的序列的后一个元素插入到前面已排好序(需要选择合适的位置)的序列中,在正序情况下时间复杂度为O(n)。堆是完全二叉树,因此树的深度一定是log(n)+1,最好和最坏时间复杂度均为O(n*log(n))。归并排序是将大数组分为两个小数组,依次递归,相当于二叉树,深度为log(n)+1,因此最好和最坏时间复杂度都是O(n*log(n))。快速排序在正序或逆序情况下,每次划分只得到比上一次划分少一个记录的子序列,用递归树画出来,是一棵斜树,此时需要n-1次递归,且第i次划分要经过n-i次关键字比较才能找到第i个记录,因此时间复杂度是\sum_{i=1}^{n-1}(n-i)=n(n-1)/2,即O(n^2)。


54、有一台带一个千兆网卡的服务器A,会把接收到的消息转发给另外两台带一个千兆网卡的服务器B和C,B和C上面的一个服务进程处理一条10K字节的消息需要2毫秒。如果在B和C上面各跑80个服务进程,在不考虑CPU负载和进程切换、内存占用、传输损耗和交互损耗的情况下,B和C服务器每秒一共大约可以处理______条10K字节的消息。(D)
50000
60000
70000
80000
"一个服务进程处理一条10K字节的消息需要2毫秒",则一进程500*10K/S,现在有2*80个进程,则最终处理160*500*10k/S,所以结果80000。
??(A) 1000M/8=125m,125M/10K=12500条消息
千兆网卡的单位是bit,也就是每秒只能发125000KB,最多处理12500条


55、 设一棵二叉树中有3个叶子节点,有8个度为1的节点,则该二叉树中总的节点数为?
13 有公式:N2=N0-1,度为2的节点个数是度为0的节点个数减一,所以N0=3,则N2=2,再加上N1=8,总的是13


56、 10个相同的糖果,分给三个人,每个人至少要得一个。有(D)种不同分法
36
一共这么几种情况:
118,127,136,145;
226,235,244;
334;
然后有数字重复的算3种排列,不重复的算6种排列,共计4×3+4×6=36种。
10个糖果依次排开,中间有9个空挡 ,依次编号为空挡1-9,从这9个空挡中任意取出2 个作为分割点 ,正好能把糖果分为3份,并且保证每一份中至少有一个糖果。因为分割点并没有顺序,所以可以使用组合公式C(9,2)计算。


57、假定x=500,求下面函数的返回值_6_____ 。
1
2
3
4
5
6
7
8
9
10 int fun(int x)
{
int countx = 0;
while (x)
{
countx++;
x = x & (x – 1);
}
return countx;

x每次与x-1进行一次与(&)操作,就会导致x二进制中的1减少一个。通过函数fun可知,x二进制中有多少位1就会进行多少次与计算。
500的二进制表示是:111110100,共有6个1。所以答案是6。


58、在32位机器上
设有以下说明和定义:
1
2
3
4
5
6
7
8
9
10
11 typedef union {
long i;
int k[5];
char c;
} DATE;
struct data {
int cat;
DATE cow;
double dog;
} too;
DATE max;
则语句 printf("%d",sizeof(struct data)+sizeof(max));的执行结果是: 52
共用体里面你们肯定都是明白的,DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20 。
但是到了结构体里面,其实它是这样的,首先一个Int,然后后面5个int,再然后是一个double,所以最大的成员长度是8不是20,然后6个int刚刚24,然后加上8是32,加上共用体是52,如果你把第一个Int cat去掉,你仍然会发现,结构体大小还是32,因为8个字节内存对齐,前面2个int一组,最后还单一个int也要占8个字节。希望能对内存对齐不明白的童鞋有所帮助。

59、局部变量能否和全局变量重名?
能,局部会屏蔽全局。要用全局变量,需要使用"::"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

60、 如何引用一个已经定义过的全局变量?
extern
可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。


61、 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错


62、 static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

0 0