关闭

笔试——题库汇总(阿里)

440人阅读 评论(0) 收藏 举报
分类:

1 不算main这个进程自身,到底创建了多少个进程啊?

int main(int argc, char* argv[])
{
   fork();
   fork() && fork() || fork();
   fork();
}

18
19
20
21

这里写图片描述
先执行第一个fork产生两个进程,包括主进程。
fork() && fork() || fork(); 这一句先执行第一个fork,产生4个,在这4个中有两个是主进程返回非零值,两个子进程返回0值,因而会影响接下来的运行。先判断fork() && fork(),如果第一个fork产生了0值,则第二个fork不会执行,直接执行||后面 的fork,入产生非零值,则fork() && fork()该表达式还需要继续判断&&后面的fork的真假。

【答案】http://blog.csdn.net/hs794502825/article/details/10242091
http://blog.csdn.net/jason314/article/details/5640969

2 在一个童话世界里,任意两个人之间要么是朋友关系,要么是敌人关系,不存在其他关系及没有关系的情况。并且,如果A和B是朋友关系,B和C是朋友关系,那么A和C必然是朋友关系。那么关于这个童话世界中的人群的说法错误的是:__
可能只有1个人群,这个人群内部是朋友关系。
可能有2个人群,人群内部是朋友关系,人群之间是敌人关系。
可能有3个及以上个人群,人群内部是朋友关系,人群之间是敌人关系。
如果存在多个人群,并且人群内部是朋友关系,人群之间是敌人关系,那么这些人群必然是差不多大小的。

选项D中的情况可以是其中一个人群只有一个人,另外一个人群可以由很多人。
这样一个世界里朋友关系是比较不容易发生变化的。

3 一条很长的河,河水的流速是1m/s,一个皮划艇逆流滑行的速度是2m/s。某一刻皮划艇运动员发现丢失了一只漂流瓶,然后调头顺流以相同的节奏划船,经过半小时后发现了漂流瓶。请问船调头时距离漂流瓶多远()?
5400m
3600m
7200m
1800m
9000m
无法判断

【关键点】A 5400m,人逆流速度2m/s,河流流速1m/s,所以人在静水速度3m/s,人在顺水速度4m/s。

4 下列不属于hash碰撞解决方法的是()。
线性探测 1 2 3 …m-1
单旋转法
二次探测 1² -1² 2² -2² …
拉链法 链地址法
双重散列
多重散列

旋转法是将数据的键值中进行旋转。如5062101旋转之后得到1506210,这是产生随机散列值(hash)的一种方法,不是解决hash碰撞的方法
散列:产生散列值得过程,用哈希函数来产生 直接定址、数字分析、平方取中、折叠法、除留余数法等
解决冲突的方法:
拉链法:http://sjjp.tjuci.edu.cn/sjjg/DataStructure/DS/web/chazhao/chazhao9.4.3.3.htm

5 有两个32bit的数A、B,使用下面方式得到32bit的数C、D。哪一种可以使用C、D得到A、B的值?
C=(int32)(A+B),D=(int32)(A-B)
C=(int32)(A+B),D=(int32)((A-B)>>1)
C=(int32)(A+B),D=B
C=(int32)(A+B),D=(int32)(A+2*B)
C=(int32)(A*B),D=(int32)(A/B)
都不可以,可能溢出

C
第一项:A=(C+D)/2,B=C-A
第二项:D右移一位,不知道移出的是1还是0,不能恢复
第三项:A=C-D,B=D
第四项:B=D-C,A=C-B
第五项:虽然可以C*D再开方,但是不能确定A和B的正负
但是对于无符号数,A不行,这里简单起见,以3bit数为例。例如A=111,B=110。C=A+B=001(溢出),D=A-B=001,所以A不能正确恢复了。C仍然可以,A=C-D=001-110=111。D答案,同样因为溢出不能恢复。

6 关于引用以下说法错误的是()。
引用必须初始化,指针不必
引用初始化以后不能被改变,指针可以改变所指的对象
不存在指向空值的引用,但是存在指向空值的指针
一个引用可以看作是某个变量的一个“别名”
引用传值,指针传地址
函数参数可以声明为引用或指针类型

首先,E明显是不对的。引用也是传递的地址,否则你在函数内部操作的就不可能是实参,而只能是形参。实参的内容是不会改变的。其次B项说法不明确,“引用初始化以后不能被改变 ”有歧义。如果已有&a = b; 则不能再有&a = c; 若b = 2; &a = b; a = 5;则是可以的,b的值也将被赋为5。考虑到B项后面又说:“指针可以改变所指的对象 ”,该题考察的应该是前一种意思。综上所诉,选E

7 下列关于线程调度的叙述中,错误的是()。
调用线程的sleep()方法,可以使比当前线程优先级低的线程获得运行机会
调用线程的yeild()方法,只会使与当前线程相同优先级的线程获得运行机会 yeild()会给优先级相同的或者比自己高的线程运行的机会。✘
当有比当前线程的优先级高的线程出现时,高优先级线程将抢占CPU并运行
一个线程由于某些原因进入阻塞状态,会放弃CPU
具有相同优先级的多个线程的调度一定是分时的 在批处理操作系统中并不存在分时调度。✘
分时调度模型是让所有线程轮流获得CPU使用权

8、 一台刚刚接入互联网的WEB服务器第一次被访问到时,不同协议的发生顺序是下面中的__
ARP -> DNS -> HTTP
ARP -> HTTP -> DNS
DNS -> HTTP -> ARP
DNS -> ARP -> HTTP
HTTP -> ARP -> DNS
HTTP -> DNS -> ARP
信息发送出去都是由低层逐层向上传递的,arp是数据链路层的协议,dns是网络层的协议、http是应用层的协议。 选A

9、以下程序输出是__

#include <iostream> 
using namespace std; 
int main(void) 
{ 
    const int a = 10; 
    int * p = (int *)(&a); 
    *p = 20; 
    cout<<"a = "<<a<<", *p = "<<*p<<endl; 
    return 0; 
} 

编译阶段报错运行阶段报错
a = 10, *p = 10
a = 20, *p = 20
a = 10, *p = 20
a = 20, *p = 10

选D。
因为a 和p都指向相同的内存地址,所以输出的前两个结果是相同的,但为啥相同的内存里的结果不相同么?--这就是常量折叠.
这个”常量折叠”是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。
因为编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏似的: #define pi 3.1415,用到pi时就用3.1415代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!!!
简单的说就是,当编译器处理const的时候,编译器会将其变成一个立即数。

10、将整数序列(7-2-4-6-3-1-5)按所示顺序构建一棵二叉排序树a(亦称二叉搜索树),之后将整数8按照二叉排序树规则插入树a中,请问插入之后的树a中序遍历结果是__

答案:1-2-3-4-5-6-7-8

11、如下SQL语句中,__可能返回null值。
(1) select count(*) from t1;
(2) select max(col1) from t1;
(3) select concat(‘max=’,max(col1)) from t1;
(1)不可能,(2)和(3)可能

(1)返回的是表的行数,如果没有记录,应该返回0,不会出现NULL,
(2) 和(3) 正常情况下不会出现NULL,但是如果表里面没有记录,则会出现NULL

12 以下使用了贪心算法的是__
KMP算法
希尔排序算法
冒泡排序算法
Dijkstra算法
快速排序算法
Floyd算法

正确答案: D Dijkstra算法

13 进程阻塞的原因不包括__
时间片切换
等待I/O
进程sleep Sleep之后进程处于中断挂起状态。当系统恢复后进程会从中断点继续进程运行。
等待解锁

正确答案: A

14
Dijkstra算法用于求解图中两点最短路径,其时间复杂度O(n^2)
Floyd-Warshall算法用于求解图中所有点对之间最短路径,其时间复杂度为O(n^3)
找出n个数字的中位数至少需要O(n*logn)的时间 快排时从中间比,一比即中就是O(1)
基于比较的排序问题的时间复杂度下界是O(n*logn)

15 如果在一个排序算法的执行过程中,没有一对元素被比较过两次或以上,则称该排序算法为节俭排序算法,以下算法中是节俭排序算法的有__
插入排序 每个未排序的元素只会与 已经有序的元素进行至多一次比较
选择排序
堆排序 是选择排序的一种
归并排序 每个有序列表内的元素不进行比较;列表之间的元素比较一次之后就进入了同一个列表

选择排序 :
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区*R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换*,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

16 设 m 和 n 都是 int 类型,那么以下 for 循环语句,__
for(m=0,n=-1;n=0;m++,n++)
n++;
A.循环体一次也不执行
B.循环体执行一次
C.是无限循环
D.有限次循环
E.循环结束判断条件不合法
F.运行出错

选A,因为n=0是赋值运算,先将0给n然后再判断n是否为真,其为假故永不执行。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:29461次
    • 积分:2419
    • 等级:
    • 排名:第15341名
    • 原创:64篇
    • 转载:3篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论