1.答题时间90分钟,请注意把握时间;
2.试题分为四个部分:单项选择题(10题,20分)、不定向选择题(4题,20分)、填空问答(5题,40分)、综合体(1题,20分);
3.其他一些乱七八糟的考试说明。
一、单项选择题
1.下列说法错误的是:
A.SATA硬盘的速度大约为500Mbps
B.读取18XDVD光盘数据的速度为1Gbps
C.千兆以太网的数据读取速度为1Gpbs
D.读取DDR3内存数据的速度为100Gbps
思路:这种题目看似要是记住了就好了,其实记住常识就好了, 首先,C肯定是对的,因为就是定义嘛,内存比较快比较正常,所以D应该是对的,500Mbps大概就是62.5M/s的传输速度,显然符合我们对硬盘的预期,于是B显然是错的,光盘怎么可能有硬盘快。
如果要严格意义上分析这个题目的意思的话,SATA 3.0的速度约为600Mbps,18XDVD前面的18X是倍速的意思,1X约为150KB/s(1.2288Mbps),18X最多不过24Mbps,所以说B太离谱了,至于DDR3,可以看到,DDR3-2133的极限传输速度大概150Gbps。
2.()不能用于Linux中的进程通信
A.共享内存
B.命名管道
C.信号量
D.临界区
思路:见深刻理解Linux进程间通信,需要注意的是,这个题目要是概念清楚点就没啥问题了,临界区是保证在某一时刻只有一个线程能访问数据的方法,也就是说它是实现进程同步互斥的控制机制,信号量虽然也能用来控制进程线程的同步互斥,但是~
所谓的临界区(critical section),实际上指的是一段代码。选D;在《Windows核心编程第五版》中,对临界区的解释是:它是一小段代码,它在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行操控。这里的原子方式,指的是代码知道除了当前线程之外,没有其他任何线程会同时访问该资源。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开临界区之前,系统是不会去调度任何想要访问同一资源的其他线程。
至于A、B、C,都是进程通信的手段。
3. 设在内存中有P1,P2,P3三道程序,并按照P1,P2,P3的优先级次序运行,其中内部计算和IO操作时间由下表给出(CPU计算和IO资源都只能同时由一个程序占用):
P1:计算60ms---》IO 80ms---》计算20ms
P2:计算120ms---》IO 40ms---》计算40ms
P3:计算40ms---》IO 80ms---》计算40ms
完成三道程序比单道运行节省的时间是()
A.80ms
B.120ms
C.160ms
D.200ms
思路:没什么好解释的
4. 两个等价线程并发的执行下列程序,a为全局变量,初始为0,假设printf、++、--操作都是原子性的,则输出不可能是()
void foo() {
if(a <= 0) {
a++;}else{
a--;}printf("%d", a);}A.01 ?
B.10
C.12
D.22
思路:这个题目让我感觉出得很坑爹,没什么技术含量,也许是我弄清楚题意吧,希望过段时间有人能给我解释解释这道题,我的直觉告诉我这题选奇数
5.给定fun函数如下,那么fun(10)的输出结果是()
int fun(intx)
{return(x==1)? 1 : (x + fun(x-1));
}A.0
B.10
C.55
D.3628800
思路:10+9+…+1=55
6.在c++程序中,如果一个整型变量频繁使用,最好将他定义为()
A.auto
B.extern
C.static
D.register
思路:寄存器快嘛,而且整型也正好能放进寄存器,详见变量的存储类型。C语言中提供了存储四种修饰符:auto,register,extern,static
7.长为n的字符串中匹配长度为m的子串的复杂度为(C)
A.O(N)
B.O(M+N)
C.O(N+LOGM)
D.O(M+LOGN)思路:KMP算法和BM算法的时间复杂度是O(M+N),后缀数组方法可以到O(N+LOGM) ,详见
http://blog.sina.com.cn/s/blog_69fd58a10100za77.html
8.判断一包含n个整数a[]中是否存在i、j、k满足a[i] + a[j] = a[k]的最小的时间复杂度为()
A. O(n3) B.O(n2lgn) C.O(n2) D.O(nlgn)
思路:O(N2)的算法能想一大堆,虽然最终我选的C,比如说用hash的话,三维遍历可以轻松编程二维遍历,但是总感觉是不是应该有nlgn的算法。
9.三次射击至少能中一次的概率是0.95,请问至少一次射击能中的概率是多少?
A.0.63B.0.5
C.**
D.0.85
思路:简单的概率计算,1-(1-P)3 =0.95
10.下列序排算法中最坏复杂度不是n(n-1)/2的是_
A.快速排序 B.冒泡排序 C.直接插入排序 D.堆排序
思路:由堆排序的过程可知堆排序最好最坏的时间复杂度都是O(NlgN)
二、不定向选择题
1.阻塞、就绪、运行的三态转换
A.就绪到运行 B.运行到就绪 C.运行到阻塞 D.阻塞到运行 E.阻塞到就绪
这题考察linux系统的进程调度问题,A、B、C、E都是可以的。D中,阻塞到运行,中间需要经历就绪状态。
进程切换图,待补充。
2.一个栈的入栈数列为:1、2、3、4、5、6;下列哪个是可能的出栈顺序。
假如出栈序列为4123,显然不满足上述要求,因为对于4,它后面比它小的数字序列为123,递加,所以不是合法出栈序列。
若出栈为3142,也不合法,因为3后面比它小的1和2不是递减排列的。
若出栈为1234,则合法,因为对于每一个数字,它后面没有比它小的数字。
对于入栈顺序为123456789abcdef,给定一个出栈序列判断其合法性。
如出栈为67d51f94e2ba83c,因为对于d,它后面比它小的19或4e或123或ac等等都不是递减的,所以不合法。
又如379a8b65c4ed21f,这是按上面要求写的,可以证明是合法的出栈顺序
注:这用来排除那些错误的出栈顺序很有效。对于这个方法我也没有进行过证明,可能对某些情况下的特殊序列会存在误判吧..
3.不用中间变量交换两个整型数字的值,下列哪些代码可以使得a和b交换数值。(选项不记得)
4.A和B很无聊,然后数天上的星星(所以还真是无聊),然后每个人能力有限,每次只能数K颗星星,其中20<=K<=30,A先数,B接着数,谁先数完最后一批谁赢,问星星有多少颗的时候能保证A先数总是能赢。答案有五个选项。
A.2013 B.2886 C.4026 D......E.....
思路:排除法就好了,如果天上有x颗星星,必定有2n*k<x<=(2n+1)*k,先用k=20排除几个答案,然后用21排除就只剩一个答案了。貌似我当时排除完之后只剩下E了
(1)对于星星总数为n,可以选择某个k值20<=k<=30,使得(n-k)mod50==0时,A有必胜的策略,首先,A先取,使剩余的星星为50的倍数。然后数星星的顺序为B、A、B、A……。B数a个星星,则A就数50-a个,使剩余星星始终为50的倍数,最后,一定是A数最后的星星。A必胜。如2825,读者可自行推导。
(2)若n mod 50==0,则A必败。B所采用的策略同(1)类似,如2500。
(3)对于星星总数为n,可以选择某个k值0<k<20,使得(n-k)mod50==0时,A必胜。A先取20,则此时30<(n-20) mod 50<50。B数a个星星,则a数50-a个星星。在最后一轮中,剩余星星的个数在(30,50)区间,B取任意值都不能取完,A最后取,获胜。如A选项的,2013。A先取20个,剩余1993个,之后每一回合,A、B共取50个,最后一轮剩余43个,B无法取完,B取后剩余数量在[13,23]之间,A一定获胜。(假设星星数量不足20个时,可以一下子取完。)
(4)对于星星总数为n,可以选择某个k值30<k<50,使得(n-k)mod50==0时,A必败,因为A每取a个,B就取50-a个,最后剩余的个数在(30,50)之间,A无论怎么取,都无法阻止B最后取完。因此A必败。如B选项中的2888。
三、填空问答题
1.给你一个整型数组A[N],完成一个小程序代码(20行之内),使得A[N]逆向,即原数组为1,2,3,4,逆向之后为4,3,2,1
void reverse(int * a,int n) {for(int i=0;i<n/2;++i){//swap
a[i]=a[i]+a[n-1-i];a[n-1-i]=a[i]-a[n-1-i];a[i]=a[i]-a[n-1-i];}}
2.自选调度方面的问题,题目很长,就是给你三个线程,分别采用先来先分配的策略和最短执行之间的调度策略,然后计算每个线程从提交到执行完成的时间。题目实在太长,还有几个表格。考察的是操作系统里面作业调度算法先进先出和最短作业优先。多道程序设计与作业调度--先来先服务与短作业优先算法的比较,给定了三个作业,已知三个作业的进入时间,处理时间,作业一旦进入不会被打断,求周转时间。
3.有个苦逼的上班族,他每天忘记定闹钟的概率为0.2,上班堵车的概率为0.5,如果他既没定闹钟上班又堵车那他迟到的概率为1.0,如果他定了闹钟但是上班堵车那他迟到的概率为0.9,如果他没定闹钟但是上班不堵车他迟到的概率为0.8,如果他既定了闹钟上班又不堵车那他迟到的概率为0.0,那么求出他在60天里上班迟到的期望。
4.战报交流:战场上不同的位置有N个战士(n>4),每个战士知道当前的一些战况,现在需要这n个战士通过通话交流,互相传达自己知道的战况信息,每次通话,可以让通话的双方知道对方的所有情报,设计算法,使用最少的通话次数,是的战场上的n个士兵知道所有的战况信息,不需要写程序代码,得出最少的通话次数。
见另一篇文章的分析
5.有N个人,其中一个明星和n-1个群众,群众都认识明星,明星不认识任何群众,群众和群众之间的认识关系不知道,现在如果你是机器人R2T2,你每次问一个人是否认识另外一个人的代价为O(1),试设计一种算法找出明星,并给出时间复杂度(没有复杂度不得分)。
思路:从第一个人开始问,问他是不是认识旁边的人,如果他认识,那么他肯定不是明星,直接把这个人去掉,如果他不认识,那么被问的人肯定不是明星,被问的人从集合中去掉,这样问一次就可以删掉一个人,最后剩下的就是明星了,时间复杂度O(N)
四、综合题
有一个淘宝商户,在某城市有n个仓库,每个仓库的储货量不同,现在要通过货物运输,将每次仓库的储货量变成一致的,n个仓库之间的运输线路围城一个圈,即1->2->3->4->...->n->1->...,货物只能通过连接的仓库运输,设计最小的运送成本(运货量*路程)达到淘宝商户的要求,并写出代码。
皇冠用户仓库开销:某淘宝金冠用户在多个城市有仓库,每个仓库的储货量不同,现在要通过货物运输,将每次仓库的储货量变成一致的,n个仓库之间的运输线路围城一个圈,运输只能在相邻的仓库之间进行,设计最小的运送成本(运货量*路程)
思路:这个在各种online-judge平台上都有答案,纯粹的数学问题,
如图,这是一个仓库分布的模拟,假设从第i个仓库向第i+1个仓库转移的物品为Pi个单位,其中Pi为负表示思是从i+1个仓库转移到第i个仓库,第n个仓库转移到第一个仓库即为Pn,设最后每个仓库平均后的货物为ave个单位,则有要最小化|P1|+|P2|+…+|Pi|+…+|Pn|
ave[i]=ave=A[i]-Pi+Pi-1
ave[1]=A[1]-P1+Pn
然后设W[i]=ave[i]-A[i]=-Pi+Pi-1
于是S[i]=W[1]+W[2]+….W[i]=Pn-Pi
即Pi=Pn-S[i] ,所以问题归结到最小化|Pn-S[1]|+|Pn-S[2]|+…+|Pn-S[n]|
所以Pn是S中位数的时候最小
另有相关帖子:
http://www.cnblogs.com/xinyuyuanm/archive/2013/05/05/3061714.html
http://blog.youkuaiyun.com/chenglinhust/article/details/8889933
http://blog.youkuaiyun.com/cfxks1989/article/details/8888121
http://blog.youkuaiyun.com/tingyuanss/article/details/8887473
http://www.cnblogs.com/obama/archive/2013/05/06/3061529.html