一、不定项选择题
1、关于HTTP协议的说法,以下哪些说法是不正确的()?
A、有状态,前后请求有关联关系
B、FTP也可以使用HTTP协议
C、HTTP响应包括数字状态码,200代表此次请求有正确返回
D、HTTP和TCP,UDP在网络分层里是同一层次的协议
1、ABD
A:Http是无状态的协议
B:FTP有两个端口,并且应用场景不一样,协议的标准自然不一样
D:HTTP是应用层的协议,而TCP/UDP是传输层的协议
二、单选题
2、以下代码运行结果为()
#include<stdio.h>
int main()
{
uint32_t a = 100;
while (a > 0)
{
--a;
}
printf("%d", a);
return 0;
}
A、-1
B、100
C、0
D、死循环
2、C
Unsigned int型数字最小为0,因此不是死循环,a到0就跳出循环,最后输出0
3、以下哪种排序算法需要开辟额外的存储空间()
A、选择排序
B、归并排序
C、快速排序
D、堆排序
3、B
归并算法基本操作是合并两个已经排序的表,因为这两个表是已经排序的,所以若将输出放到第三个表中则该算法可以通过对输入数据一趟排序来完成,因此是需要额外存储空间的
4、如果将固定块大小的文件系统中的块大小设置大一些,会造成()。
A、更好的磁盘吞吐量和更差的磁盘空间利用率
B、更好的磁盘吞吐量和更好的磁盘空间利用率
C、更差的磁盘吞吐量和更好的磁盘空间利用率
D、更差的磁盘吞吐量和更差的磁盘空间利用率
4、A
使用多大的块大小,需要根据你的系统综合考虑,如果系统用作邮件或者新闻服务器,使用较大的块大小,虽然性能有所提高,但会造成磁盘空间较大的浪费。比如文件系统中的文件平均大小为2145byte,如果使用4096byte的块大小,平均每一个文件就会浪费1951byte空间。如果使用1024byte的块大小,平均每一个文件会浪费927byte空间。
5、若一颗二叉树的前序遍历为a,e,b,d,c,后序遍历为b,c,d,e,a,则根节点的孩子节点()
A、只有e
B、有e,b
C、有e,c
D、不确定
5、A
解题思路:由先序遍历第一个结点为a,则可知道树的根节点为a。后序遍历序列中根节点会把序列分为左右两段,左段为左子树上结点,右段为右子树上结点,所以由后序遍历序列可知b,c,d,e均为a结点的左子树上的点,a不存在右子树。再由先序遍历序列知道e为根结点a的左孩子结点。即根节点的孩子结点只有e,且为左孩子。
6、在一个世世代代都重男轻女的村庄里,村长决定颁布一条法律,村子里没有生育出儿子的夫妻可以一直生育直到生出儿子为止,假设现在村子上的男女比例是1:1,这条法律颁布之后的若干年后村子的男女比例将会()
A、男的多
B、女的多
C、一样多
D、不能确定
6、B
用概率论中的期望来解这道题目。
假设生男生女的比例是0.5:0.5,即一样。
那么一对夫妻,他们生的孩子是男孩的期望为
E(男孩)=1*0.5+1*0.52+。。。+1*0.5n=1-0.5n。
上面的公式说明的是一对夫妻,第一次生到男孩的概率是0.5,如果第一次生不到男孩,则第二次生男孩的概率为0.52,....则第n次才生到男孩的概率是0.5n
当n--》无穷大时,E(男孩)=1,即一对夫妻生男孩的期望数是1个,这和我们想的一样,因为无论怎么生,生到1个男孩就停止,没有生到就继续生下去,无论如何,也只有一个男孩。
接下来,分析一下他们生女孩的期望数
E(女孩)=0*0.5+1*0.5+(1*0.5+0.52)+...+(1*0.5+0.52+...+0.5n-1)=(n-1)*0.5+(n-2)*0.52...0.5n-1=n*0.5-1+0.5n。
所以,上面的公式说明一对夫妻,第一次生到男孩,则生女孩数为0,第二次才生到男孩,则此时有1个女孩,这种生法概率为0.5,。。。则第n次才生到男孩,则此时已有n-1个女孩,这种生法的概率为(1*0.5+0.52+...+0.5n-1),要是连续没有生到男孩,那他们会一直生下去,即当n--》无穷大时,E(女孩)=n=无穷大。所以,如果一直没有生到男孩子,则女孩会越来越多。
所以,一对夫妻他们生的男孩:女孩的比例约为1:n(n为自然数)。
可以知道,只有当n<1时,女孩比例才会比男孩小。
不过我们可以发现在数轴上,(0,1)区间要比(1,无穷)区间的长度小得多,这说明n>1的概率要大于n<1的概率。所以一对夫妻生女孩数大于男孩数的概率要比 生男孩数大于女孩数的概率 大。
那么对于村里m对夫妻的情况,当m足够大的时候,根据大数定律,这样的情况更明显,即夫妻生女孩数大于男孩数的概率要比 生男孩数大于女孩数的概率 大。
所以,按照这种规定,之后男女比例会失调,女孩会比男孩多。
这也和重男轻女造成的结果互相吻合。
答案选B
7、批处理操作系统的目的是()。
A、提高系统资源利用率
B、提高系统与用户的交互性能
C、减少用户作业的等待时间
D、降低用户作业的周转时间
7、A
批处理操作系统不具有交互性,它是为了提高CPU的利用率而提出的一种操作系统。
8、设有一个关系:DEPT(DNO,DNAME),如果要找出倒数第三个字母为W,并且至少包含4个字母的DNAME,则查询条件子句应写成WHERE DNAME LIKE()
A、'_ _W_%'
B、'_%W_ _'
C、'_W__'
D、'_W_%'
8、B
在SQL语言中,我们可以使用两个通配符:%和_,其中“%”表示0个或多个字符,而“_”则表示一个字符。在本题的查找条件中,要求倒数第三个字母为W,应表示成“W_ _”,并且还要求至少包含4个字母,而当以“%”开头时,它表示的字符可以不存在,所以开头应加一个“_”,那么查询条件子句应写成WHERE DNAME LIKE'_% W_ _'。
9、已知的一个无向图(边为正数)中顶点A,B的一条最短路P,如果把各个边的权重(即相邻两个顶点的距离)变为原来的2倍,那么在新图中,P仍然是A,B之间的最短路,以上说法是()
A、错误
B、正确
9、B
10、如下程序的时间复杂度为(其中m>1,e>0)()
x = m;
y = 1;
while (x - y > e)
{
x = (x + y) / 2;
y = m / x;
}
print(x);
A、log m
B、m的平方
C、m的1/2方
D、m的1/3方
10、A
算法的时间复杂度O(n),在n比较小的时候,规律不明显。想象一下,logX,X1/2,X1/3函数的曲线,在x比较小时区别不大。但是当x比较大时差别比较明显。
所以我们在取m>1,e>0时,不妨将m取较大数,e取较小数(当m较大时e相当于0)。然后看函数内部执行。
x=m,y=1;
x-y>0;
1.x=(x+y)/2=(m+1)/2 m非常大,则 x=m/2;
y=m/x, x=m/2 则 y=2;
2.x=(x+y)/2=(m/2+2)/2=m/4+1 m非常大,则 x=m/4;
y=m/x, x=m/4 则 y=4;
3.x=(x+y)/2=(m/4+4)/2=m/8+2 m非常大,则 x=m/8;
y=m/x, x=m/8 则 y=8;
........
x=m/2n,y=2n
当x-y=m/2 n -2 n=0时 m/2 n -2 n=0 m=22n => n=(logm)/2
11、求fun(484)的返回值()
bool fun(int n){
int sum=0;
for(int i=1;n>sum;i=i+2)
sum=sum+i;
return (n==sum);
}
A、True
B、False
11、A
loop 1:sum=1, i=3
loop 2:sum=4, i=5
loop 3:sum=9, i=7
loop 4:sum=16,i=9
loop 5:sum=25,i=11
loop 6:sum=36,i=13
loop 7:sum=49,i=15
...
通过规律可以发现sum的值为循环次数的平方,22*22=484,循环退出时sum=484,函数返回true。
12、关于主对角线(从左上角到右下角)对称的矩阵为对称矩阵;如果一个矩阵中的各个元素取值为0或1,那么该矩阵为01矩阵,求大小为N*N的01对称矩阵的个数?()
A、power(2,n)
B、power(2,n*n/2)
C、power(2,(n*n+n)/2)
D、power(2,(n*n-n)/2)
12、C
【解析】对称矩阵由它的上三角矩阵唯一确定。
只要它主对角线和主对角线右上方的元素都确定了。主对角线左下方的元素根据对称的原则便可确定。
因此需要确定n*(n+1)/2个元素
13、现代的语言(如Java)的编译器的词法分析主要依靠()。
A、有限状态自动机
B、确定下推自动机
C、非确定下推自动机
D、图灵机
13、A
词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。
14、如下函数的f(1)的值为( )
int f(int n){
static int i=1;
if(n>=5)
return n;
n=n+i;
i++;
return f(n);
}
A、5
B、6
C、7
D、8
14、C
该函数为递归调用。
f(1):n=2;i=2;调用f(2)
f(2):n=4;i=3;调用f(4)
f(4):n=7;i=4;调用f(7)
f(7):返回7
即最终函数返回结果为7
选C
二、填空题
15、123456789101112...2014除以9的余数是( )
15、1
分析:这个大数可分解为 1 * 10n + 2 * 10n-1 + ... + 2014 * 100 (①式)。而 10m - 1 (m为自然数)都可以被 9 整除。将①式减掉 1 * 9999...9(共n-1个9)+ 2 * 9999...9(共n-2个9)... + 2014 * 9 之后余数不变。这问题转化为求 1 + 2 + ... + 2014 的余数,1一直加到2014的和为(1+2014)*2014/2 = 2029105, 2029105 MOD 9 = 1。所以余数为 1。
三、解答题
16、给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如:" i am a little boy. ",变成"i am a little boy",语言不限,但不要用伪代码作答,函数输入输出请参考如下的函数原型:
C++函数原型:
void FormatString(char str[],int len){
}
16、
char* removeEmpty(char *str, char ch) {
char *it1 = str;
char *it2 = str;
while (*it2 != '\0') {
//while (*it2 == ch) {it2++; }
while (*it2 == ch && *(it2 + 1) == ch)
{
it2++;
}
*it1++ = *it2++;
}
return str;
}
void FormatString(char str[], int len){
str = removeEmpty(str, ' ');
}
17、给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。描述你程序的最坏时间复杂度,并实现具体函数,函数输入输出请参考如下的函数原型:
C++函数原型:
strucy TreeNode{
TreeNode* left; //指向左子树
TreeNode* right; //指向右子树
TreeNode* father; //指向父亲节点
};
TreeNode* LowestCommonAncestor(TreeNode* first,TreeNode* second){
}
17、由于有父节点指针,这道题目的难度一下子就降低了许多。
思路一:我们首先找到两个节点的高度差,然后从较靠近根结点的一层开始向上找,若父节点为同一节点则该节点为解。
int getHeight(TreeNode *node) {
int height = 0;
while (node) {
height++;
node = node->parent;
}
return height;
}
TreeNode* LowestCommonAncestor(TreeNode* first,TreeNode* second) {
int height1 = getHeight(first), height2 = getHeight(second), diff = height1 - height2;
if (diff < 0) {
diff = -diff;
while(diff--) {
second = second->parent;
}
} else {
while(diff--) {
first = first->parent;
}
}
while (first != second) {
first = first->parent;
second = second->parent;
}
return first;
}
思路二:若允许浪费空间,那么可以用两个Stack来存储从first和second到根结点的各个节点,然后出栈时比较地址是否一致,最后一个地址一致的节点为解。
两种方法最坏时间复杂度均为O(n)。
18、有n枚硬币按照0到n-1对它们进行编号,其中编号为i的硬币面额为vi,两个人轮流从剩下硬币中取出一枚硬币归自己所有,但每次取硬币的时候只能取剩下的硬币中编号最小的硬币或者编号最大的硬币,在两个都采用最优策略的情况下,作为先取硬币的你请编写程序计算出你能获得硬币总面额的最大值?(请简述算法原理,时间复杂度并实现具体的程序),语言不限。
int MaxValue(int v[],int n){
}
18、
/*区间dp???*/
int MaxValue(int v[],int n)
{
for(int i=1;i<=n;i++)
dp[i][i] = v[i];
for(int i=n-1;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
//区间dp
dp[i][j] = max(dp[i+1][j]+v[i],dp[i][j-1]+v[j]);
}
return dp[1][n];
}