哔哩哔哩 | 2020C/C++工程师笔试题详解
Posted 学益得智能硬件
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哔哩哔哩 | 2020C/C++工程师笔试题详解相关的知识,希望对你有一定的参考价值。
作者 | Lee
试题来自牛客网。
一
某台计算机连接了8个相同的设备,有N个进程在竞争使用,每个进程最多会同时占用3个设备,请问当N大于等于多少时,系统可能发生死锁?
A、2
B、3
C、4
D、5
答案:C
题解:
对于三个进程,可以有两个进程分别获得3台,使其执行完释放后让第三个进程获得3台,所以也不会产生死锁;对于四个进程,假若每个进程各获得2台而同时需要另外一台,产生了死锁,所以产生死锁的最小值是4。
死锁问题:
设备m = 3,进程数p,资源r = 8,如果发生死锁,应该满足:
p * (m - 1) + 1 > r
二
以下哪种操作不会导致计算机从用户态切换至内核态?
A、访问内存时出现缺页异常
B、对一个变量进行取模运算
C、创建一个子进程
D、读取硬盘中文件的内容
答案:B
题解:
用户态切换到内核态的三种方式:
系统调用
异常
外围设备中断
三
TCP协议在常见的七层网络模型中属于哪一层?
A、传输层
B、网络层
C、会话层
D、数据链路层
答案:A
题解:
各层常见协议:
传输层:TCP UDP
网络层:IP
会话层:RPC、SQL
数据链路层:ARP、RARP、PPP
四
UDP是一种无连接的网络协议,那么以下哪个选项不是UDP协议报头的内容?
A、序号(Sequence Number)
B、源端口号(Source Port)和目标端口号(Destination Port)
C、报文长度(Length)
D、校验和(Checksum)
答案:A
题解:
五
以下哪个排序算法是稳定的?
A、快速排序
B、选择排序
C、冒泡排序
D、堆排序
答案:C
题解:
稳定排序算法
冒泡排序 插入排序 桶排序 归并排序
不稳定排序算法
选择排序 希尔排序 堆排序 快速排序
六
一颗有512个节点的完全二叉树的高度是多少?
A、9
B、10
C、11
D、12
答案:B
题解:
具有 n 个节点的完全二叉树,高度为 (logn) + 1。
七
如果想列出当前目录以及子目录下所有扩展名为“.txt”的文件,那么可以使用以下哪个命令?
A、find . -name "*.txt"
B、grep "*.txt" -r *
C、ls "*.txt"
D、less "*.txt"
答案:A
题解:
选项B:用于搜索关键字;
选项C:显示名为*.txt的文件;
选项D:查看文件*.txt的内容;
八
以下哪一项不是c++11新引入的容器
A、std::array
B、std::map
C、std::unordered_map
D、std::forward_list
答案:B
题解:
C++新增的容器有:
unordered_map
unordered_set
unordered_multimap
unordered_multiset
array
forward_list
tuple
九
使用gcc编译一份C代码的过程,报错提示"undefined reference to 'XXXXX'",这是哪个阶段出错了?
A、预处理
B、编译
C、汇编
D、链接
答案:D
题解:
"undefined reference to 'xxx'"表示在链接的时候找不到对应的函数。
十
在以下哪种容器上,不能应用二分查找算法?
A、std::vector
B、std::deque
C、std::list
D、std::array
答案:C
题解:
二分查找要求容器使用的是连续的存储空间,list是双向链表。
十一
以下哪一项不会导致C程序发生“段错误”?
A、忘记释放已分配的内存块
B、引用不存在的常量
C、引用已经被释放的内存块
D、访问数组越界
答案:A
题解:
忘记释放内存只会导致内存泄漏。
十二
2019! 的末尾有多少个零?
A、501
B、502
C、503
D、504
答案:B
题解:
5! = 1 * 2 * 3 * 4 * 5;
只有 5 和某个偶数结合,才能产生一个 0 。
5 / 5 = 1。
10! = 1 * ... * 5 * ... * 10;
5 和 10 分别和某个偶数结合,均能产生一个 0 。
10 / 5 = 2;
25! = 1 * ... * 5 * ... * 25;
数字 5 10 15 20,和某个偶数结合,均能产生一个 0 ,其中 25 能拆成 5 * 5,所以可以产生两个 0 。
25 / 5 = 5; 5 / 5 = 1; 5 + 1 = 6;
于是,2019!可以产生:
2019 / 5 + 403 / 5 + 80 / 5 + 16 / 5 = 502
十三
tcp连接建立需要几次握手?
A、1
B、2
C、3
D、4
答案:C
题解:
TCP建立连接:三次握手,断开连接:四次挥手。
十四
以下哪种TCP状态需要等待2MSL
A、TIME_WAIT
B、CLOSE_WAIT
C、CLOSING
D、FIN_WAIT
答案:A
题解:
十五
路由器工作在网络协议的哪一层
A、物理层
B、链路层
C、网络层
D、应用层
答案:C
题解:
路由器工作在网络层,负责数据的分组和转发。
十六
虚拟内存的容量只受()的限制
A、物理内存大小
B、磁盘空间大小
答案:D
十七
以下哪个步骤会产生汇编代码文件
A、预处理
B、编译
C、汇编
D、链接
答案:B
题解:
预处理:处理所有以‘’#开头的代码;
编译:语法检查,将 C 文件转换成汇编文件;
汇编:将汇编文件转换成二进制文件;
链接:链接需要用到的其他文件(比如库文件)。
十八
A、2G
B、4G
C、512M
D、256M
答案:B
题解:
十九
按照二叉树的定义,具有3个结点的二叉树有几种。
A、3
B、4
C、5
D、6
答案:C
题解:
二十
以下哪个不是栈的基本操作
A、删除栈底的元素
B、删除栈顶的元素
C、判断栈是否为空
D、栈置空
答案:A
题解:
只能操作栈顶元素,无法直接操作栈底元素。
二十一
堆排序的时间复杂度为
A、n
B、nlogn
C、logn
D、n^2
答案:B
题解:
常见排序的时间复杂度:
插入排序:n^2
希尔排序:n^1.3
冒泡排序:n^2
选择排序:n^2
快速排序:nlogn
归并排序:nlogn
堆排序: nlogn
二十二
有6个元素6,5,4,3,2,1的顺序进栈,问下列哪一个不是合法的出栈序列
A、5 4 3 6 1 2
B、4 5 3 1 2 6
C、3 4 6 5 2 1
D、2 3 4 1 5 6
答案:C
题解:
选项C:6不可能在5前面出栈。
二十三
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
原地翻转句子中单词的顺序,但单词内字符的顺序不变。要求:空间复杂度O(1),时间复杂度O(n)。
输入描述:
英文句子中单词以一个空格符隔开。为简单起见,标点符号和普通字母一样处理。
输出描述:
翻转之后的英文句子,单词内字符的顺序不变,以一个空格隔开。
输入例子1:
I am a student.
输出例子1:
student. a am I
void reverse(char start[], char end[])
{
int i;
char t;
int length = end - start + 1;
for (i = 0; i < length / 2; i++)
{
t = start[i];
start[i] = start[length - 1 - i];
start[length - 1 - i] = t;
}
}
int main()
{
char str[256] = {0};
scanf("%[^ ]", str);
int length = strlen(str);
reverse(str, str + length - 1);
int i = 0;
int begin = 0; //记录单词开始的下标
while (str[i] != ' ')
{
if (str[i] == ' ')
{
reverse(str + begin, str + i - 1);
while (str[i] == ' ')
{
i++;
}
begin = i;
}
i++;
}
reverse(str + begin, str + i - 1);
printf("%s ", str);
return 0;
}
二十三
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
输入描述:
一行输入,数组中的数字用逗号隔开。例如:
输入为:
32,231
则表示数组{32, 231}
输出描述:
直接输出最小数字即可,如示例题目中,输出为:
23132
输入例子1:
32,231
输出例子1:
23132
答案:
int my_strcmp(char *s1, char *s2)
{
char *start1 = s1, *start2 = s2;
while (*s1 != ' ' && *s2 != ' ')
{
if (*s1 > *s2)
{
return 1;
}
else if (*s1 < *s2)
{
return -1;
}
s1++;
s2++;
}
if (*s1 == ' ')
{
if (*start2 > *s2)
{
return 1;
}
else
{
return -1;
}
}
if (*s2 == ' ')
{
if (*start1 > *s1)
{
return -1;
}
else
{
return 1;
}
}
}
void sort(char *a[], int length)
{
int i, j;
for (i = 0; i < length - 1; i++)
{
for (j = 0; j < length - i - 1; j++)
{
if (my_strcmp(a[j], a[j + 1]) > 0)
{
char *t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
int main()
{
char *array[1024] = {0};
char ch;
int i = 0, k = 0;
array[i] = (char *)malloc(sizeof(char) * 16);
while (1)
{
ch = getchar();
if (ch == ',')
{
i++;
array[i] = (char *)malloc(sizeof(char) * 16);
k = 0;
continue;
}
if (ch == ' ')
{
break;
}
array[i][k++] = ch;
}
sort(array, i + 1);
int j = 0;
for (j = 0; j <= i; j++)
{
printf("%s", array[j]);
}
printf(" ");
return 0;
}
二十三
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
有N件物品,它们的重量w分别是w1,w2,...,wn,它们的价值v分别是v1,v2,...,vn,每件物品数量有且仅有一个,现在给你个承重为M的背包,求背包里装入的物品具有的价值最大总和?
输入描述:
物品数量N=5件
重量w分别是2 2 6 5 4
价值v分别是6 3 5 4 6
背包承重为M=10
输出描述:
背包内物品最大总和为15
输入例子1:
5
10
2 2 6 5 4
6 3 5 4 6
输出例子1:
15
答案:
int max(int a, int b)
{
return (a > b) ? a : b;
}
int main()
{
int N, M;
scanf("%d%d", &N, &M);
int *w = (int *)malloc(sizeof(int) * N);
int *v = (int *)malloc(sizeof(int) * N);
int i;
for (i = 0; i < N; i++)
{
scanf("%d", &w[i]);
}
for (i = 0; i < N; i++)
{
scanf("%d", &v[i]);
}
int **dp = (int **)malloc(sizeof(int *) * (N + 1));
for (i = 0; i < N + 1; i++)
{
dp[i] = (int *)malloc(sizeof(int) * (M + 1));
}
for (i = 1; i <= N; ++i)
{
for (j = 1; j <= M; ++j)
{
dp[i][j] = (j-w[i-1] >= 0) ? max(dp[i-1][j-w[i-1]]+v[i-1], dp[i-1][j]) : dp[i-1][j];
}
}
printf("%d ", dp[N][M]);
return 0;
}
★ 系 列 课 推 荐 ★
温馨提示
以上是关于哔哩哔哩 | 2020C/C++工程师笔试题详解的主要内容,如果未能解决你的问题,请参考以下文章
爬取哔哩哔哩全站所有投稿在 2020年03月09日 - 2020年03月12日 的播放前百视频
ahjesus-2020 哔哩哔哩 bilibili 批量下载工具,多 P 解析,定期更新