阿里笔试题目总结

转自:http://blog.sina.com.cn/s/blog_62ef85c20101mj3a.html

题目一:一个有10亿条记录的文本文件,已按照关键字排好序存储,设计算法,可以快速的从文件中查找指定关键字的记录

答案:

10亿在 G量级, 分成100份, 为10M量级, 基本上放入内存无压力了.

在这10亿记录中, 均分为100份, 把每份的第一条记录关键字和此记录对应的文件偏移量先扫入内存(类似索引), 这里需要磁盘随机io 100次.

这样可以马上定位出指定关键字所在的记录块, 把相应的记录块拿到内存, 二分查找即可.

题目二:各种排序算法的稳定性和时间复杂度(平均和最差):

排序法 平均时间复杂度 最差情形复杂度 稳定度 额外空间 备注
冒泡     O(n2)     O(n2) 稳定 O(1) n小时较好
交换     O(n2)     O(n2) 不稳定 O(1) n小时较好
选择     O(n2)     O(n2) 不稳定 O(1) n小时较好
插入     O(n2)     O(n2) 稳定 O(1) 大部分已排序时较好
基数    O(logRB)    O(logRB) 稳定 O(n)

B是真数(0-9),

R是基数(个十百)

Shell   O(nlogn)  O(ns) 1 不稳定 O(1) s是所选分组
快速   O(nlogn)    O(n2) 不稳定 O(nlogn) n大时较好
归并   O(nlogn)    O(nlogn) 稳定 O(1) n大时较好
  O(nlogn)    O(nlogn) 不稳定 O(1) n大时较好

题目三:查看系统负载

方法:w 或者 uptime 或者 procinfo 或者 top

[root@client1 ~]# top
 
top - 17:06:38 up 2 days,  3:06,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 162 total,   1 running, 161 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2054588k total,   815752k used,  1238836k free,   102272k buffers
Swap:  4128760k total,        0k used,  4128760k free,   488684k cached
 
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
12085 root      20   0 15088 1284  952 R  0.3  0.1   0:00.02 top
1 root      20   0 19404 1572 1256 S  0.0  0.1   0:00.98 init
2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
3 root      RT   0     0    0    0 S  0.0  0.0   0:00.14 migration/0
4 root      20   0     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
7 root      RT   0     0    0    0 S  0.0  0.0   0:00.13 migration/1
8 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/1
9 root      20   0     0    0    0 S  0.0  0.0   0:00.01 ksoftirqd/1
10 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/1
11 root      RT   0     0    0    0 S  0.0  0.0   0:00.14 migration/2
 
第一行解释: 
top - 17:06:38 up 2 days,  3:06,  1 user,  load average: 0.00, 0.00, 0.00 
17:06:38 :系统当前时间 
up 2 days :系统开机到现在经过了2天 
1 users:当前1用户在线
load average:0.00,0.00,0.00:系统1分钟、5分钟、15分钟的CPU负载信息
 
第二行解释: 
Tasks: 162 total,   1 running, 161 sleeping,   0 stopped,   0 zombie 
162 total:当前有162个任务
1 running:1个任务正在运行
161 sleeping:161个进程处于睡眠状态 
0 stopped:停止的进程数
0 zombie:僵死的进程数
 
第三行解释: 
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
 
0.0%us:用户态进程占用CPU时间百分比 
0.0%sy:内核占用CPU时间百分比
0.0%ni:renice值为负的任务的用户态进程的CPU时间百分比。nice是优先级的意思
100.0%id:空闲CPU时间百分比
0.0%wa:等待I/O的CPU时间百分比
0.0%hi:CPU硬中断时间百分比
0.0%si:CPU软中断时间百分比
 
第四行:
Mem:   2054588k total,   815752k used,  1238836k free,   102272k buffers 
2054588k total:物理内存总数
815752k used: 使用的物理内存
1238836k free:空闲的物理内存
102272k buffers:用作缓存的内存
 
第五行:
Swap:  4128760k total,        0k used,  4128760k free,   488684k cached
4128760k total:交换空间的总量
0k used: 使用的交换空间
4128760k free:空闲的交换空间
488684k cached:缓存的交换空间
 
最后一行:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
PID:进程ID
USER:进程的所有者
PR:进程的优先级
NI:nice值
VIRT:占用的虚拟内存
RES:占用的物理内存
SHR:使用的共享内存
S:进行状态 S:休眠 R运行 Z僵尸进程 N nice值为负
%CPU:占用的CPU
%MEM:占用内存
TIME+: 占用CPU的时间的累加值
COMMAND:启动命令
 
常用操作指令:
q:退出top命令
:立即刷 
s:设置刷新时间间隔
c:显示命令完全模式
t::显示或隐藏进程和CPU状态信息
m:显示或隐藏内存状态信息
l:显示或隐藏uptime信息
f:增加或减少进程显示标志
S:累计模式,会把已完成或退出的子进程占用的CPU时间累计到父进程的MITE+
P:按%CPU使用率排行
T:按MITE+排行
M:按%MEM排行
u:指定显示用户进程
r:修改进程renice值
kkill:进程
i:只显示正在运行的进程
W:保存对top的设置到文件~/.toprc,下次启动将自动调用toprc文件的设置。
 
题目四:两个线程运行在双核机器上,每个线程主程序如下,线程1:x=1;r1=y;线程2:y=1;r2=x。x和y是两个全局变量,初始为0。以下哪一个是r1和r2的可能值?

A.r1=1,r2=1

B.r1=1,r2=0

C.r1=0,r2=1

D.r1=0,r2=0

答案:A,B,C

考察临界区问题,没有设置临界区,所以可能:

A: x=1 => y=1 => r1=y=1 => r2=x=1

B: y=1 => r2=x=0 => x=1 => r1=y=1

C: x=1 => r1=y=0 => y=1 =>r2=x=1

题目五:假设把整数关键码K散列到有N个槽的散列表,以下哪些散列函数是好的散列函数(A)

A、h(K)=K mod N;
B、h(K)=1;
C、h(K)=K/N;
D: h(K)=(K+rand(N)) mod N, rand(N)返回一个0到N-1的整数

题目六:下面排序算法中,初始数据集的排列顺序对算法的性能无影响的是(A)
A、堆排序      B、插入排序
C、冒泡排序    D、快速排序

题目七:下面说法错误的是:(D)

A、CISC计算机比RISC计算机指令多
B、冯诺依曼机体系结构的主要特征是存储程序的工作方式
C、增加流水线段数理论上可以提高CPU频率
D、在指令格式中,采用扩展操作码设计方案的目的是为了保持指令字长不变而增加寻址空间

 
题目八:不属于冯诺依曼机体系结构必要组成部分的是:(B)

A、CPU          B、Cache        C、RAM        D、ROM

题目九:一个栈的入栈序列式ABCDE,则不可能的出栈序列是:(C)
A、DECBA          B、DCEBA          C、ECDBA       D、ABCDE

题目十:关于C++/JAVA类中的static成员和对象成员的说法正确的是:(A)

A、虚成员函数不可能是static成员函数
B、static成员函数在对象成员函数中无法调用
C、static成员变量在对象构造时生成
D、static成员函数不能访问static成员变量
 
题目十一:你认为可以完成编写一个C语言编译器的设计语言是:(D)

A、汇编语言        B、C语言       C、VB语言       D、以上皆可

 
题目十二:某进程在运行过程中需要等待从磁盘上读入数据,此时该进程的状态将:(C)
A、从就绪变为运行       B、从运行变为就绪
C、从运行变为阻塞       D、从阻塞变为就绪

题目十三:n从1开始,每个操作可以选择对n加1或者对n加倍。若想获得整数2013,最少需要(C)个操作。

A、24        B、21        C、18       D、不可能

 
题目十四:对于一个具有n个顶点的无向图,若采用邻接表数据结构表示,则存放表头节点的数组大小为:(A)
A、n         B、n+1       C、n-1      D、n+边数

题目十五:对于顺序存储的线性数组,访问节点和增加、删除节点的时间复杂度为:(C)

A、O(n),O(n)         B、O(n),O(1)         C、O(1),O(n)          D、O(1),O(1)

题目十六:袋中有红球,黄球,白球各一个,每次任意取一个又放回,如此连续抽取3次,则下列事件中概率是8/9的是:(A)

A、颜色不全相同            B、颜色全相同          C、颜色全不同         D、颜色无红色

题目十七:一个洗牌程序的功能是将n张牌的顺序打乱,以下关于洗牌程序的功能定义说法最恰当的是:(C)

A、任何连续位置上的两张牌的内容独立
B、n张牌的任何两个不同排列出现的概率相等
C、每张牌出现在n个位置上的概率相等
D、每张牌出现在n个位置上的概率独立

题目十八:用两种颜色去染排成一个圈的6个棋子,如果通过旋转得到则只算一种,一共有(B)种染色模式。
A、10         B、14         C、15         D、16

题目十九:假设函数rand_k会随机返回一个【1,k】之间的随机数(k>=2),并且每个证书出现的概率相等。目前有rand_7,通过调用rand_7()和四则运算符,并适当增加逻辑判断和循环控制逻辑,下列函数可以实现的有:(A、B、C、D)

A、rand_3         B、rand_21          C、rand_23         D、rand_47

 
题目二十:某二叉树的前序遍历序列为-+a*b-cd/ef,后序遍历序列为abcd-*+ef/-,问其中序遍历序列是:a+b*c-d-e/f  
 
分析:二叉树的三个基本单元是:根节点(D)、右子树(R)与左子树(L)
对二叉树的可能遍历顺序为:DLR, LDR, LRD, DRL, RDL, RLD六种 
对应有DLR, LDR, LRD三种,分别称之为先序遍历,中序遍历和后序遍历,形成先序序列,中序序列和后序序列
 
题目二十一:32位系统环境,编译选项为4字节对齐,那么sizaof(A)和sizeof(B)分别(B)
struct A  {  
int a;  
short b;  
int c; 
char d;
  };  
struct B  {  
 int a;  
 short b; 
 char d; 
  int c;  
};  
A、16,16               B、16,12            C、13,12       D、11,16

题目二十二:下列算法的复杂度:(B)
int f(unsigned int n)  
{  
    if(n == 0 || n == 1)  
        return 1;  
    else  
        return n*f(n-1);  
}
A、O(1)        B、O(n)        C、O(N*N)       D、O(n!)

题目二十三:某缓存系统采用LRU淘汰算法,假定缓存容量为4,并且初始为空,那么在顺序访问以下数据项的时候,1、5、1、3、5、2、4、1、2,出现缓存直接命中的次数是(),最后缓存中即将准备淘汰的数据项是()
LRU(Least Recently Used)算法:就是把最近一次使用时间离现在时间最远的数据删除掉。
分析:列出每一次访问数据项时,缓存的状态

1
1,5
5,1 命中
5,1,3
1,3,5 命中
1,3,5,2
3,5,2,4 超过缓存容量上限,删除1
5,2,4,1 超过缓存容量上限,删除3
5,4,1,2 命中

所以答案就出来了,直接命中次数是3,最后缓存中准备淘汰的数据项是5

 
题目二十四:宿舍内5个同学一起玩对战游戏,每场比赛有一些人作为红方,另一些人作为蓝方,请问至少需要多少场比赛,才能使任意两个人之间有一场红方对蓝方和一场蓝方对红方的比赛?
答案:四场
AB-CDE
ACD-BE
BCE-AD
DE-ABC
参考地址:http://blog.csdn.net/hackbuteer1/article/details/11931173
原文地址:https://www.cnblogs.com/x_wukong/p/3945356.html