滴滴出行2018校园招聘内推笔试-Linux内核工程师

1 编程题

1. 整数无序数组求第K大数
给定无序整数序列,求其中第K大的数,例如{45,67,33,21},第2大数为45

输入描述:
输入第一行为整数序列,数字用空格分隔,如:45 67 33 21
输入第二行一个整数K,K在数组长度范围内,如:2
输出描述:
输出第K大的数,本例为第2大数:45

题目分析:首先对数组排序,然后找到第k大的数。
代码实现:

#include 
#include 
#include 
using namespace std;
int main(){
    vector<int>arr;
    int k;
    while(cin >> k){
        arr.push_back(k);
    }
    sort(arr.begin(), arr.end() - 1);
    cout << arr[arr.size() - k - 1] << endl;
    return 0;
}

2. 给定整数序列求连续子串最大和
  给定无序整数序列,求连续子串最大和,例如{-23 17 -7 11 -2 1 -34},子串为{17,-7,11},最大和为21

输入描述:
  输入为整数序列,数字用空格分隔,如:-23 17 -7 11 -2 1 -34
输出描述:
  输出为子序列的最大和:21

题目分析:通过两个变量来存储当前连续数组的和,另一个存储历史最大的连续数组的和。
代码实现:

#include 
#include 
using namespace std;
int main(){
    vector<int>arr;
    int tmp;
    while(cin >> tmp) arr.push_back(tmp);
    int iCur = arr[0], iMax = arr[0];
    for(int i = 1; i < arr.size(); i++){
        if(iCur <= 0) iCur = arr[i];
        else iCur += arr[i];
        iMax = iMax > iCur ? iMax : iCur;
    }
    cout << iMax << endl;
    return 0;
}

2 选择题

3. 有二十五匹速度各不相同的马来赛跑,一次只能跑五匹,每匹马每次跑的状态稳定,没有计时设备,那么请问:最少需要多少次才能找出跑得最快的三匹马
A. 6   B.7   C.8   D.11

正确答案:B
题目分析:首先将25匹马分为5批进行甄选,结果如下:(下面的每组结果均已分出快慢顺序,前面的最快)
 a1 a2 a3 a4 a5 第 一 组   a 1   a 2   a 3   a 4   a 5
 b1 b2 b3 b4 b5 第 二 组   b 1   b 2   b 3   b 4   b 5
 c1 c2 c3 c4 c5 第 三 组   c 1   c 2   c 3   c 4   c 5
 d1 d2 d3 d4 d5 第 四 组   d 1   d 2   d 3   d 4   d 5
 e1 e2 e3 e4 e5 第 五 组   e 1   e 2   e 3   e 4   e 5
将以上五组中的最快的马取出组成第六组,
 a1 b1 c1 d1 e1 第 六 组   a 1   b 1   c 1   d 1   e 1
此时最快的马已经确定为 a1 a 1 ,且第二名与第三名的候选马分别为 a2,a3,b1,b2,c1 a 2 , a 3 , b 1 , b 2 , c 1 ,因此将候选马作为第7组进行甄选,结果为:
 a2 a3 b1 b2 c1 第 起 组   a 2   a 3   b 1   b 2   c 1
因此最少七次即可得出前三名马。

4. 每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机),一箱油可供一架飞机绕地球飞半圈. 问:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机? (所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场)
A. 3  B. 4  C.5  D. 6

正确答案:C
题目分析:将地球分为八格,如下图所示:
滴滴出行2018校园招聘内推笔试-Linux内核工程师_第1张图片
起初派出3架飞机a(4),b(4),c(4),其中4代表携带的油量可以飞行4格,到达下一格时各个飞机的状态为a(3),b(3),c(3),然后a(3)给b(3)c(3)各加能够飞行一个格的油量,a(-1),b(4),c(4),其中负号代表逆时针飞行,然后按照图示继续分析即可。

5. 房间里有8人,分别佩戴着从1号到8号的纪念章,任选3人记录其纪念章号码,最大的号码为6的概率()
A. 1/4  B. 9/28  C. 3/14  D. 5/28

正确答案:D
题目分析: 从8个人中选出三人一共有 C38=56 C 8 3 = 56 中情况;选出的三个人中最大号码是6的情况有 C11C25=10 C 1 1 ∗ C 5 2 = 10 ,所以概率为5/28

6. 小桔A和小桔B轮流在方桌上放硬币,规则是硬币不能互相覆盖,谁最后没有地方放为输,请问下面哪个答案正确
A. 后放者有必胜策略  B. 先放者有必胜策略   C. 无论谁都没有必胜策略

正确答案:B
题目分析:考虑到极端情况,如果桌子上只能放一个硬币,则先放着将硬币放在桌子正中央,则后放着就不能继续放硬币了。

7. 滴滴出行年会大 Party 已经开始筹划,小明作为总策划人,计划来一个“专车送喜”的节目引爆全场。节目主要是把神秘礼物放在一个大铁球中,铁球固定在牢固的地桩上,然后用汽车拉开铁球释放神秘礼物。任一铁球拉开所需的汽车数量一模一样,且拉开后不可恢复,铁球可能只要1辆车就能拉开,也可能要100辆车才能拉开。年会前2个测试用的铁球已经送到,现在小明请你用这2个铁球、100辆车(每辆车提供的马力一样)来测试每个铁球至少需要配多少辆车才能拉开。聪明的你最少要经过多少次测试能得出结论呢?
A. 12  B. 14  C. 25  D. 33

正确答案:B
题目分析:

8. 计算P=1111+1111*2+1111*3+…+1111*1111,P除以5的余数是多少?
A. 0  B. 1

正确答案:B
题目分析:
P=1111+11112+11113+...+11111111 P = 1111 + 1111 ∗ 2 + 1111 ∗ 3 + . . . + 1111 ∗ 1111
=1111(1+2+3+...+1111) = 1111 ∗ ( 1 + 2 + 3 + . . . + 1111 )
=111111111112/2=11111111556 = 1111 ∗ 1111 ∗ 1112 / 2 = 1111 ∗ 1111 ∗ 556
P除以5的余数为 P%5=((1111%5)(1111%5)(556%5))%5=1 P % 5 = ( ( 1111 % 5 ) ∗ ( 1111 % 5 ) ∗ ( 556 % 5 ) ) % 5 = 1

9. 某粮仓有60万担粮食,现需要给前线运送粮食,粮仓距离前线行程有15天,但是运粮队每次只能携带30万担粮食,且每天行军需要消耗1万担粮食,问其最多能将多少万担粮食运到前线?
A. 15  B. 20  C. 25  D. 30

正确答案:C
题目分析:理想情况下,先将30万担粮食带到十天的位置,然后携带10万担粮食回到粮仓,再带着30万担粮食到达10天处,此时一共有30万担粮食,运粮队带着这30万担粮食运到前线需要5万担,因此,最多能运25万担粮食到前线。但是,最终能留到前线的粮食只有10万担。因为运粮队回来还得吃东西,不是吗?

10. 两个口袋,每个口袋里都装着60个红球与40个白球,有两人各自从一个口袋抽了一个球。 则抽出不同色球的概率为 :
A. 0.5  B. 0.24  C. 0.3  D. 0.48

正确答案:D
题目分析:首先,摸到红球的概率是3/5,摸到白球的概率是2/5,抽出的两个球颜色相同的概率为:(3/5)*(3/5)+(2/5)*(2/5)=13/25,那么两个球颜色不同的概率就是12/25=0.48

11. 甲和乙一起玩游戏——抢数字,设置要抢的数字是S,每次只能数N个(5<=N<=10),两人轮流数。最后谁数到S谁获胜,若甲先开始,那么当S为多少时候甲必胜?()
A. 2017  B. 2019  C. 2021  D. 2023

正确答案:AB
题目分析:由题意,经分析,只要当S对15取余得到的值在5到10之间且包括5和10时,甲必胜。此时,甲先取S%15,然后每次都取15-乙取得值。

12. 数列中哪个数不属于这个队列:
2 - 3 - 6 - 7 - 8 - 14 - 15 - 30
A.3  B. 7  C. 8  D. 15

正确答案:C
题目分析:可以发现,数列的规律是偶数与奇数交错排列,因此8是多余的。

13. 下面的程序会打印几个hello?
int main(void) {
  fork();
  printf(“hello\n”);
  fork();
  printf(“hello\n”);
  while(1);
  return 0;
}

A. 2  B. 4  C. 6  D. 8

正确答案:C
题目分析:一个进程包括代码、数据和分配给进程的资源。fork()函数会复制出一份与当前进程一样的进程,包括代码的执行位置。

14. 通过execve(2)系统调用执行一个ELF格式的可执行程序,在execve(2)系统调用返回时,该程序的代码段和数据段
A. 已经全部加载到内存里  B. 已经部分加载到内存里  C. 完全没有加载到内存里

正确答案:C
题目分析:execve函数成功时不会有返回值,如果失败会返回-1。

15. 下面关于KVM CPU虚拟化机制的描述正确的有?
A. QEMU的线程个数最多不超过VCPU的个数
B. QEMU/KVM在X86 CPU上只能运行X86架构的虚拟机
C. KVM VM运行时处于VMX root模式
D. 每一个VCPU有且仅有一个VMCS结构

正确答案:D
题目分析:

16. 将200.200.201.0这个网络进行子网的划分,要求尽可能划分出最多的网段,但每个网段不能少于5台计算机,该子网的子网掩码是什么?
A. 255.255.255.240
B. 255.255.255.252
C. 255.255.255.248
D. 255.255.255.0

正确答案:C
题目分析:

17. 当路由器接收的IP报文的MTU大于该路由器的最大MTU时采取的策略是
A. 丢掉该分组
B. 将该分组分片
C. 像源路由器发出请求,减少其分组大小
D. 直接转发该分组

正确答案:B
题目分析:

18. 下面哪个选项可以查看磁盘或分区的剩余空间?
A. dc  B. dd  C. free  D. df

正确答案:D
题目分析:
dc命令是一个任意精度的计算器
dd命令用于复制文件并对原文件的内容进行转换和格式化处理
free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。
df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

19. 下面哪个文件打开选项不会启用文件缓存?
A. O_APPEND  B. O_SYNC  C. O_DIRECT  D. O_TRUNC

正确答案:C
题目分析:

20. Linux用于组织缓存页面的数据结构是?
A. B+ Tree  B. AVL Tree  C. Radix Tree  D. Red-Black Tree

正确答案:C
题目分析:

21. 关于linux进程,下列说法正确的是
A. 只要进程的优先级在实时优先级范围,该进程就是实时进程
B. 即使系统中存在实时进程,普通进程仍然有机会得到执行
C. 开启内核抢占之后,在中断处理程序中也可以进行进程调度
D. 如果当前cpu的运行队列上已经没有可运行的进程,内核可能会将其他cpu上的进程移动到当前cpu运行

正确答案:BD
题目分析:

22. 关于OOM以下说法,哪些是正确的
A. OOM表示系统的物理资源耗尽
B. OOM表示系统的虚拟地址空间耗尽
C. 发生OOM时,系统会杀死某些用户进程
D. 发生OOM时,表示kernel已经处于崩溃不可用的状态

正确答案:AC
题目分析:OOM(Out Of Memory),Linux系统中的一个内核机制。

你可能感兴趣的:(C++笔试真题详解)