迅雷 | C/C++工程师笔试详解

Posted 学益得智能硬件

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迅雷 | C/C++工程师笔试详解相关的知识,希望对你有一定的参考价值。



作者 | Lee



试题来自牛客网。





TCP主动关闭一方进入最后的一个状态是


A、CLOSE_WAIT

B、SYN_SENT

C、TIME_WAIT

D、LAST_ACK


答案:C


题解:


TCP关闭连接指的是四次挥手。四次挥手既可以是服务器发起,也可以是客户端发起。第一次挥手,Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。第二次挥手,Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。第三次挥手,Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。第四次挥手,Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。





关于UDP的说法正确的是


A、UDP的包没有大小限制;

B、UDP不会进行错误重传;

C、UDP和TCP一样提供可靠的数据报协议;

D、UDP有简单的流控制


答案:B


题解:


选项A:UDP数据包最大长度是65535字节(包含头部信息);

选项B:正确;

选项C:UDP不可靠,没有超时重传机制;

选项D:UDP基于数据报,不是基于流。





参考以下代码,在大端字节机器中x.c的值为


union A { short c; char buf[4];} x = {0x01, 0x02, 0x03, 0x04}


A 0x102

B 0x201

C 0x304

D 0x403


答案:A


题解:


题目的初始化存在问题,但是还是得按照题目的本意来。联合体占4个字节,四个十六进制数分别存储在数组四个元素中。


迅雷 | C/C++工程师笔试详解


00000010 00000001

如果是小端字节序,则相反,buf[1]在前,buf[0]在后。





以下哪个变量是分配在BSS段


char s1[100];int s2 = 0;static int s3 = 0;
void main() { char s4[100];}


A s1

B s2

C s3

D s4


答案:A


题解:


BSS段用于存放未初始化的全局变量。

s2属于数据段;

s3属于数据段;

s4属于栈空间。





下列关于linux文件系统的说法不正确的有?


A 全部磁盘块由四个部分组成,分别为引导块、专用块、节点表块和数据存储块。

C 超级块中包含了关于该硬盘或分区上的文件系统的整体信息,如文件系统的大小等

D 数据块是真正存储文件内容的位置 


答案:B


题解:


索引结点中不包括文件的名字,文件名是放在目录块里的。目录块里包含有文件的名字以及此文件的索引结点编号。





struct T {},sizeof(struct T)的值为


A 4

B 1

C 0

D 编译或者运行期错误


答案:B


题解:


对于空结构体,C语言结果长度为0,C++长度为1。





以下那个排序算法的时间复杂度优于O(n^2)


A 插入排序

B 冒泡排序

C 简单选择排序

D 归并排序


答案:D


题解:


归并排序的时间复杂度为O(nlogn)。





一个栈的压栈序列是A,B,C,D,E ,则不可能的出栈序列是


A EDCBA

B DECBA

C DCEAB

D ABCED


答案:C


题解:


分为三种情况:

  1. 可以全部进栈再依次出栈;

  2. 可以进栈一个再出栈一个;

  3. 可以进栈一部分、出栈一部分、再进栈一部分。


选项C中,A应该排在B的后面。





32位机器上,以下代码的输出是


char c = -1;int i0 = c;int i1 = (unsigned char)c;printf("%d, %d
", i0, i1);


A 255,255

B -1,-1

C -1,255

D 255,-1


答案:C


题解:


c和i0均为有符号数,无需类型转换;

c的二进制表示:

10000001

在内存中以补码的形式存储:

11111111

强转后,最高位不再表示符号位,即255





以下属于传输层协议的是


A TCP

B UDP

C HTTP

D ARP

E ICMP


答案:AB


题解:


HTTP属于应用层协议,包括DNS、NFS等等;

ARP和ICMP属于网络层协议,包括IP协议。



十一


以下哪些是属于TCP协议的特性


A 滑动窗口

B 多播和广播

C 超时重传

D 分片传输


答案:ACD


题解:


TCP仅支持单播传输。



十二


Unix系统关于进程和线程的说法,正确的是


A 都是调用了clone方法产生新的进程或线程

B 创建线程比创建进程要更轻量级

C 线程之间共享同一个内存空间

D 进程之间共享同一个内存空间

E 线程和进程都由内核进行调度


答案:ABCE


题解:




十三


关于C++的说法错误的是


A 一个类可以有多个析构函数

B 析构函数可以为virtual

C 编译器不会为空类产生默认构造函数

D 可以用free释放一个类对象


答案:ACD


题解:


每个类可以有多个构造函数,但是只能有一个析构函数。析构函数可以被virutal关键字声明成虚析构函数,虚析构函数可以通过基类指针释放派生类对象。编译器为每个类提供默认无参构造函数,除非用户自己定义了构造函数。创建对象使用关键字new,释放对象使用关键字delete。free只能释放内存,不能释放对象(不会调用析构函数)。



十四


以下哪些是不是解释型语言


A C/C++

B Java

C Go

javascript


答案:AB


题解:


编译型语言:程序在运行之前,需要经过编译,将程序从文本文件变成二进制文件;

解释型语言:程序在运行的时候才被翻译成机器语言,所以需要提前安装解释器,解释型语言执行效率一般比较低。



十五


以下说法不正确的是?


A 类成员的定义必须放在类定义体的内部

B 类的一个成员只能具有一种访问控制属性

C 在类中,不作特别说明的数据成员均为私有属性

D 构造函数和析构函数是特殊的成员函数,因此不允许重载

E 类成员的定义必须是成员变量在前,成员函数在后。


答案:ADE


题解:


选项A:类的定义和声明可以分开实现;

选项D:构造函数可以被重载,比如有参构造和无参构造;

选项E:成员变量和成员函数没有顺序。



十六


在32位大端模式处理器上变量b等于?


unsigned int a = 0x1234;unsigned char b = *(unsigned char *)&a;


A 0x00

B 0x12

C 0x34

D 0x1234


答案:A


题解:


所以变量 a 在内存中的存储如下:


迅雷 | C/C++工程师笔试详解





十七


在tcp/ip网络分层⾥里⾯面,icmp和igmp是属于哪一层?


A 链路层

B 网络层

C 传输层

D 应用程


答案:B


题解:


网络层的协议有:IP ICMP BGP ARP RARP等。



十八


如果ip分片报文丢失,下面说法正确的是


A  ip层负责重发

B  上层协议(例如tcp)负责重发

C  链路层负责重

D  只有传输层(例如tcp)会进行分片,ip层不负责分片


答案:B


题解:


IP层本身没有超时重传机制,由跟高层来负责超时和重传,比如TCP。

数据链路层用MTU来限制所能传输的数据包的大小,当发送的IP数据包超过MTU时,IP层来负责对数据包进行分片。



十九


在32位系统中以下函数的返回值


int fun(void){    int *p, j, i = 10; p = &j; *p = i++; i += sizeof(i) + sizeof(*p) + sizeof(p); return i;}


A  22

B  23

C  25

D 其他结果都不对


答案:B


题解:


三个sizeof()表达式结果都是4,但是含义不一样。前两个表示计算整形数据长度,第三个表示计算指针的长度。


经过第 5 行的操作,i的值变成11。表达式等价于:


i += 12;


所以结果是23。



二十


下面的陈述中哪个是正确的?


A  类必须提供至少一个构造函数

B  默认构造函数的形参列表中没有形参。

C  如果一个类没有有意义的默认值,则该类不应该提供默认构造函数。

D  如果一个类没有定义默认构造函数,则编译器会自动生成一个,同时将每个数据成员初始化为相关类型的默认值。


答案:A


题解:


选项A:每个类里面都有至少一个构造函数;

选项B:拷贝构造函数也属于默认构造函数,有一个参数;

选项C:任何类编译器都会为它提供默认构造函数,除非用户自己定了构造函数;

选项D:默认构造函数不会对数据做任何处理




二十一


下列关于C++类的说法中错误的有哪些?


一个空类默认会生成构造函数、拷贝构造函数、赋值操作符、析构函数

B  一个类可以有多个析构函数

C  类中析构函数可以为virtual,可以被重载

D  类的构造函数如果都不是public访问属性,则类的实例无法创建


答案:BCD


题解:


选项B:一个类智能有一个析构函数;

选项C:析构函数可以是虚函数,但是不能被重载;

选项D:可以通过静态成员函数调用构造函数的方式创建对象(单例模式)。




二十二


时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 128M,其他语言256M


用x,y表示一个整数范围区间,现在输入一组这样的范围区间(用空格隔开),请输出这些区间的合并。


输入描述:


一行整数,多个区间用空格隔开。区间的逗号是英文字符。


输出描述:

并后的区间,用过空格隔开,行末无空格。


输入例子1:


1,3 2,5


输出例子1:


1,5


输入例子2:


1,3 2,5 8,10 11,15


输出例子:


1,5 8,10 11,15


答案:


#include <stdio.h>
int main(){ int arr[1000] = {0}; char ch; int a, b, max = 0;
while (1) { scanf("%d,%d", &a, &b);
//将输入的区间映射到数组上,区间内标记为1,区间外默认为0 //区间右端为开,方便接下来的遍历操作 for(int i = a; i < b; i++) { arr[i] = 1; }
if (b > max) max = b;
ch = getchar(); //遇到空格则忽略 if (ch == ' ') continue; if (ch == ' ') //遇到换行符则退出 break; }
int flag = 0; //第一次遇到1输出区间开始位置,第一次遇到0输出区间结束位置 for(int i = 0; i < sizeof(arr) / sizeof(int); i++) { if(flag == 0 && arr[i] == 1) { printf("%d,", i); flag = 1; } else if(flag == 1 && arr[i] == 0) { printf("%d ", i); flag = 0;
if (i > max - 1) //最后一次打印换行符,其他情况打印空格 { printf(" "); break; } else printf(" ");        } } return 0; }




二十三


时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 128M,其他语言256M


对于一个整数N(512 <= N <= 1024),计算2的N次方并在屏幕显示十进制结果。


输入描述:


输入一个整数N(512 <= N <= 1024)


输出描述:

2的N次方的十进制结果。


输入例子1:


512


输出例子1:


1340780792994259709957402499820584612747936582059239337772356

1443721764030073546976801874298166903427690031858186486050853

753882811946569946433649006084096



答案:


#include <stdio.h>#include <string.h>
void reverse(char *r) { int length = strlen(r); int i; char ch; for (i = 0; i < length / 2; i++) { ch = r[i]; r[i] = r[length - 1 - i]; r[length - 1 - i] = ch; } }
void NPowerOfTwo(int n, char *res){ int i, length, j, num, carry; for (i = 0; i < n; i++) { carry = 0; for (j = 0; j < strlen(res); j++) { num = res[j] - '0'; num = (num << 1) + carry; carry = num / 10; res[j] = num % 10 + '0'; } if (carry > 0) res[j] = carry + '0'; }
reverse(res);}
int main( ){ int n; char result[2048] = {'1'};
scanf("%d", &n);
NPowerOfTwo(n, result);
printf("%s ", result);
return 0;}



迅雷 | C/C++工程师笔试详解

迅雷 | C/C++工程师笔试详解

迅雷 | C/C++工程师笔试详解

迅雷 | C/C++工程师笔试详解




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

解密区块链最强心脏 迅雷链共识算法详解

百度 | 2021校招C++研发工程师笔试详解

003_C/C++笔试题_分享大汇总

数据挖掘百度机器学习-数据挖掘-自然语言处理工程师 历史笔试详解

数据挖掘百度机器学习-数据挖掘-自然语言处理工程师 2023届校招笔试详解

C/C++指针的经典笔试面试题