C++笔试问题总结
2014-03-07 23:47
260 查看
1.排序的稳定性与不稳定性
稳定的排序方法有:插入排序,冒泡排序,基数排序,归并排序;
不稳定的排序方法则有:选择排序,希尔排序,快速排序,堆排序;
详细的分析
各种排序方法的性能比较:
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)。
稳定的排序方法有:插入排序,冒泡排序,基数排序,归并排序;
不稳定的排序方法则有:选择排序,希尔排序,快速排序,堆排序;
详细的分析
各种排序方法的性能比较:
排序法 | 平均时间 | 最坏情况 | 最好情况 | 稳定度 | 额外空间 | 备注 |
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),但是占用很大的空间,桶内可用快排等 |
资料
例题;
排序趟数与序列的原始状态有关的排序方法是( 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)。
相关文章推荐
- 使用Beaglebone Black的I2C (二)——使用C语言和i2c-dev驱动
- C++的头文件和实现文件分别写什么(转)
- 学习C语言基本思路与参考书籍
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试
- windows下的C++ socket服务器(4)
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化
- C++调试小助手
- C++ 内敛函数
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
- 深入理解gtest C/C++单元测试经验谈
- 搭建c/c++eclipse工具链
- 下三角形的一些思考
- C++-结构体,联合体,枚举,的区别
- C++ Primer Plus学习笔记之STL算法
- C语言浮点数比较大小