迅雷 | C/C++工程师笔试详解
Posted 学益得智能硬件
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迅雷 | C/C++工程师笔试详解相关的知识,希望对你有一定的参考价值。
作者 | Lee
试题来自牛客网。
一
TCP主动关闭一方进入最后的一个状态是
A、CLOSE_WAIT
B、SYN_SENT
C、TIME_WAIT
D、LAST_ACK
答案:C
题解:
二
关于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个字节,四个十六进制数分别存储在数组四个元素中。
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
题解:
七
以下那个排序算法的时间复杂度优于O(n^2)
A 插入排序
B 冒泡排序
C 简单选择排序
D 归并排序
答案:D
题解:
归并排序的时间复杂度为O(nlogn)。
八
一个栈的压栈序列是A,B,C,D,E ,则不可能的出栈序列是
A EDCBA
B DECBA
C DCEAB
D ABCED
答案:C
题解:
分为三种情况:
可以全部进栈再依次出栈;
可以进栈一个再出栈一个;
可以进栈一部分、出栈一部分、再进栈一部分。
选项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
答案: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 在内存中的存储如下:
十七
在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;
二十
下面的陈述中哪个是正确的?
A 类必须提供至少一个构造函数
B 默认构造函数的形参列表中没有形参。
C 如果一个类没有有意义的默认值,则该类不应该提供默认构造函数。
D 如果一个类没有定义默认构造函数,则编译器会自动生成一个,同时将每个数据成员初始化为相关类型的默认值。
答案:A
题解:
选项A:每个类里面都有至少一个构造函数;
选项B:拷贝构造函数也属于默认构造函数,有一个参数;
选项C:任何类编译器都会为它提供默认构造函数,除非用户自己定了构造函数;
选项D:默认构造函数不会对数据做任何处理。
二十一
下列关于C++类的说法中错误的有哪些?
A 一个空类默认会生成构造函数、拷贝构造函数、赋值操作符、析构函数
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
1,3 2,5 8,10 11,15
输出例子:
1,5 8,10 11,15
答案:
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
答案:
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++工程师笔试详解的主要内容,如果未能解决你的问题,请参考以下文章
数据挖掘百度机器学习-数据挖掘-自然语言处理工程师 历史笔试详解