您的位置:首页 > 编程语言 > C语言/C++

C++笔试问题总结

2014-03-07 23:47 260 查看
1.排序的稳定性与不稳定性

稳定的排序方法有:插入排序,冒泡排序,基数排序,归并排序;

不稳定的排序方法则有:选择排序,希尔排序,快速排序,堆排序;

详细的分析

各种排序方法的性能比较:
排序法
平均时间
最坏情况
最好情况
稳定度
额外空间
备注
1.直接插入
O(n2)
O(n2)
O(n)
稳定
O(1)
大部分已排序时较好(简单)
1.希尔
O(nlogn)
O(nlogn)
与步长相关
不稳定
O(1)
n小时较好(较复杂)
2.冒泡
O(n2)
O(n2)
O(n)
稳定
O(1)
n小时较好(简单)
2.快排
O(nlogn)
O(n2)
O(nlogn)
不稳定
O(logn)
n大时较好,基本有序时反而不好(较复杂)
3.直接选择
O(n2)
O(n2)
O(n2)
不稳定
O(1)
n小时较好(简单)
3.堆排序
O(nlogn)
O(nlogn)
O(nlogn)
不稳定
O(1)
n大时较好(较复杂)
4.归并
O(nlogn)
O(nlogn)
O(nlogn)
稳定
O(n)
n大时较好(较复杂)
基数
O(d(n+r))
O(d(n+r))
O(d(n+r))
稳定
O(r)
d为位数,r为基数(较复杂)
计数
O(n+k)
O(n+k)
O(n+k)
稳定
O(n+k)
优于比较排序法,0~k为数值范围
桶排序
O(n+c)
O (nlogn):所有的元素落到一个桶中
O(n)
稳定
O(n+m)
n为数的个数,m为桶数
c = n*(logn-logm)
桶越多,效率越高,n=m,达到O(n),但是占用很大的空间,桶内可用快排等
2.排序算 的性能与初始的序列无关的有堆排序,选择排序。

资料

例题;

排序趟数与序列的原始状态有关的排序方法是( C,D )排序法。

A.插入 B. 选择 C. 冒泡 D. 快速

在下列排序算法中,哪一个算法的时间复杂度与初始排序无关(D )。

A. 直接插入排序 B. 气泡排序 C. 快速排序 D. 直接选择排序

比较次数与排序的初始状态无关的排序方法是( D )。

A.直接插入排序 B.起泡排序 C.快速排序 D.简单选择排序

3.n个数依次入栈,出栈顺序有多少种?

这个问题是卡特兰数的第n项结果。


卡特兰数

  卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012,
742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...

令h(0)=1,h(1)=1,catalan数满足递推式:  h(n)=
h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)

  例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2

  h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5

  另类递推式:  h(n)=h(n-1)*(4*n-2)/(n+1);

  递推关系的解为:

  h(n)=C(2n,n)/(n+1)
(n=1,2,3,...)

  递推关系的另类解为:

  h(n)=c(2n,n)-c(2n,n+1)(n=1,2,3,...)

本题目的常规分析
  首先,我们设f(n)=序列个数为n的出栈序列种数。同时,我们假定第一个出栈的序数是k。

  第一个出栈的序数k将1~n的序列分成两个序列,其中一个是1~k-1,序列个数为k-1,另外一个是k+1~n,序列个数是n-k。

  此时,我们若把k视为确定一个序数,那么根据乘法原理,f(n)的问题就等价于——序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的f(n)=f(k-1)×f(n-k)。而k可以选1到n,所以再根据加法原理,将k取不同值的序列种数相加,得到的总序列种数为:f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)。

  看到此处,再看看卡特兰数的递推式,答案不言而喻,即为f(n)=h(n)= C(2n,n)/(n+1)= c(2n,n)-c(2n,n+1)(n=1,2,3,……)。

  最后,令f(0)=1,f(1)=1。

  非常规分析

  对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘0’。n个数的所有状态对应n个1和n个0组成的2n位二进制数。由于等待入栈的操作数按照1‥n的顺序排列、入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数。

  在2n位二进制数中填入n个1的方案数为c(2n,n),不填1的其余n位自动填0。从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所求。

  不符合要求的数的特征是由左而右扫描时,必然在某一奇数位2m+1位上首先出现m+1个0的累计数和m个1的累计数,此后的2(n-m)-1位上有n-m个
1和n-m-1个0。如若把后面这2(n-m)-1位上的0和1互换,使之成为n-m个0和n-m-1个1,结果得1个由n+1个0和n-1个1组成的2n位数,即一个不合要求的数对应于一个由n+1个0和n-1个1组成的排列。

  反过来,任何一个由n+1个0和n-1个1组成的2n位二进制数,由于0的个数多2个,2n为偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。同样在后面部分0和1互换,使之成为由n个0和n个1组成的2n位数,即n+1个0和n-1个1组成的2n位数必对应一个不符合要求的数。

  因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应。

  显然,不符合要求的方案数为c(2n,n+1)。由此得出输出序列的总数目=c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)=h(n+1)。

  类似问题 买票找零

  有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
最终结果:C(2n,n)-C(2n,n+1)

4.Unix系统使用的目录是什么类型?

UNIX系统采用树状目录结构,具有良好的安全性,保密性和可维护性。

UNIX系统是一个多用户,多任务的分时操作系统。

5、程序的完整编译过程分为是:预处理,编译,汇编等,如下关于编译阶段的编译优化的说法中不正确的是(A)

A、死代码删除指的是编译过程直接抛弃掉被注释的代码;

B、函数内联可以避免函数调用中压栈和退栈的开销

C、For循环的循环控制变量通常很适合调度到寄存器访问

D、强度削弱是指执行时间较短的指令等价的替代执行时间较长的指令

死代码是指永远不会执行到的代码,不是注释,比如if(0){…},大括号里的就是死代码。

6、如下关于进程的描述不正确的是(D)

A、进程在退出时会自动关闭自己打开的所有文件

B、进程在退出时会自动关闭自己打开的网络链接

C、进程在退出时会自动销毁自己创建的所有线程

D、进程在退出时会自动销毁自己打开的共享内存

共享内存销毁了,会对其他正在使用这段内存的进程造成破坏。

7、TCP的关闭过程,说法正确的是(D)

A、TIME_WAIT状态称为MSL(Maximum Segment Lifetime)等待状态

B、对一个established状态的TCP连接,在调用shutdown函数之前调用close接口,可以让主动调用的一方进入半关闭状态

C、主动发送FIN消息的连接端,收到对方回应ack之前不能发只能收,在收到对方回复ack之后不能发也不能收,进入CLOSING状态

D、在已经成功建立连接的TCP连接上,如果一端收到RST消息可以让TCP的连接端绕过半关闭状态并允许丢失数据。

8、操作系统的一些特别端口要为特定的服务做预留,必须要root权限才能打开的端口描述正确的是(C)

A、端口号在64512-65535之间的端口

B、所有小于1024的每个端口

C、RFC标准文档中已经声明特定服务的相关端口,例如http服务的80端口,8080端口等

D、所有端口都可以不受权限限制打开

9、在程序设计中,要对两个16K×16K的多精度浮点数二维数组进行矩阵求和时,行优先读取和列优先读取的区别是(B)

A、没区别

B、行优先快

C、列优先快

D、2种读取方式速度为随机值,无法判断

10、如下关于编译链接的说法错误的是(B)

A、编译优化会使得编译速度变慢

B、预编译头文件可以优化程序的性能

C、静态链接会使得可执行文件偏大

D、动态链接库会使进程启动速度偏慢

11、如下关于链接的说法错误的是(C)

A、一个静态库中不能包含两个同名全局函数的定义

B、一个动态库中不能包含两个同名全局函数的定义

C、如果两个静态库都包含一个同名全局函数,他们不能同时被链接

D、如果两个动态库都包含一个同名全局函数,他们不能同时被链接

12,甲、乙两个人在玩猜数字游戏,甲随机写了一个数字,在[1,100]区间之内,将这个数字写在了一张纸上,然后乙来猜。

如果乙猜的数字偏小的话,甲会提示:“数字偏小”

一旦乙猜的数字偏大的话,甲以后就再也不会提示了,只会回答“猜对 或 猜错”

问: 乙至少猜 多少次 猜可以准确猜出这个数字,在这种策略下, 乙猜的第一个数字是 。

14次,第一次猜测数字为14。思想是:每次猜大后,尝试猜测的总次数是相等的。第一次猜测时,在1到100之间选择某个数N1后,有三种情况,一是直接选中了,这个概率比较小,对研究没有意义,二是选择偏大了,这时不再提示了,只能在1至N1-1之间一个一个地选了,三是选择偏小了,这时还有提示,可以继续在[N1+1,100]中选择另外的数N2。可以知道,若第一次就猜错了,那么尝试总次数是N1-1+1=N1次(因为是在[1,N1-1]之间逐一取值,且N1本身用掉一次),若第一次猜得偏小,但第二次猜大了,尝试总次数是[N1+1,N2-1]的元素个数加2(加2是N2和N1本身猜用掉一次),即为N2-N1+1次,根据思想“每次猜错后,尝试猜测的总次数相等”,有N1=N2-N1+1,可知N2=2N1-1,增量为N1-1。类似地,前两次猜得偏小,但第三次猜大,尝试总次数为[N2+1,N3-1]的元素个数加3,即N3-N2+2,那么有N3-N2+2=N1,N3=N2+N1-2,增量为N1-2……依此类推,增量是随着猜测次数的增加而逐1地减少。设最后一次猜测为k,则Nk=N1+(N1-1)+(N1-2)+…1,Nk是等于或大于100的第一个数,根据等差数列求和公式可以算出N1=14,N2=27,N3=39…(14,27,39,50,60,69,77,84,90,95,99)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: