哔哩哔哩 | 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


题解:


用户态切换到内核态的三种方式:

  1. 系统调用

  2. 异常

  3. 外围设备中断





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


题解:


哔哩哔哩 | 2020C/C++工程师笔试题详解





以下哪个排序算法是稳定的


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


题解:


MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态。当TCP的一端主动发起关闭,在发出最后一个ACK包后,即发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,主要是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。



十五


路由器工作在网络协议的哪一层


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


题解:


哔哩哔哩 | 2020C/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

答案:


#include <stdio.h>#include <string.h>
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


答案:


#include <stdio.h>#include <stdlib.h>#include <string.h>
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


答案:


#include <stdio.h>#include <stdlib.h>
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++工程师笔试题详解


ps.春招即将开始,想要斩获高薪offer,硬实力才是关键。推荐几门就业课程,程线上答疑+就业指导。智能家居项目实战,就业+毕设一站解决


★ 系 列 课 推 荐 ★


哔哩哔哩 | 2020C/C++工程师笔试题详解




温馨提示






以上是关于哔哩哔哩 | 2020C/C++工程师笔试题详解的主要内容,如果未能解决你的问题,请参考以下文章

个人简介

实习丨哔哩哔哩:后端开发

爬取哔哩哔哩全站所有投稿在 2020年03月09日 - 2020年03月12日 的播放前百视频

ahjesus-2020 哔哩哔哩 bilibili 批量下载工具,多 P 解析,定期更新

ahjesus-2020 哔哩哔哩 bilibili 批量下载工具,多 P 解析,定期更新

iOS 14.2 隐藏功能曝光 / 高通发布骁龙 888 芯片 / 哔哩哔哩 2020 年度弹幕出炉