百度 | 2021校招C++研发工程师笔试详解
Posted 学益得智能硬件
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度 | 2021校招C++研发工程师笔试详解相关的知识,希望对你有一定的参考价值。
作者 | Lee
试题来自牛客网。
一
以下说法中错误的是()
A、类必须提供一个构造函数;
B、默认构造函数没有形参;
C、一个类已经定义了构造函数,编译器将不在合成默认构造函数;
D、如果一个类没有提供构造函数,编译器会默认生成,并把每个数据成员初始化成相关默认值。
答案:AB
题解:
选项A:如果类中没有构造函数,编译器会提供一个默认的无参构造函数;
选项B:默认的构造函数有两种:无参默认构造函数和拷贝构造函数,其中拷贝构造函数有参数。
二
配接器是STL的一个重要配件,一种用来修饰容器、仿函数、迭代器接口的东西。以下那一项是配接器()。
A、set;
B、list;
C、deque;
D、stack;
答案:D
什么是配接器?
配接器这个概念其实是一种设计模式。将一个类的接口转换为另一个类的接口,使原本接口不相兼容的类可以一起运作。
容器配接器?
STL提供两种容器配接器:stack和queue。他们都是修饰deque接口而构成另一种风格的容器面貌。
三
后序遍历为二叉树遍历方式中的一种,假设将{ 3, 8, 9, 1, 2, 6 }依次插入初始为空的二叉排序树。则该树的后序遍历结果是多少()。
A、1, 2, 8, 6, 9, 3
B、2, 1, 6, 9, 8, 3
C、1, 2, 3, 6, 9, 8
D、2, 1, 3, 6, 9, 8
答案:B
插入后的二叉排序树如图:
四
关于以下代码说法正确的有?
using namespace std;
std::map<int, char*> my;
std::pair<int, char*> test() {
int a = 10;
char buff[128];
sprintf(buff, "%d test", 99);
return std::make_pair(a, buff);
}
int main() {
my.insert(test());
for (auto iter = my.begin(); iter != my.end(); ++iter)
{
cout << iter->first << endl;
cout << iter->second << endl;
}
return 0;
}
std::pair<int, char*> test() {
std::shared_ptr<char> buff(new char[128]);
sprintf(buff.get(), "%d test", 99);
return std::make_pair(10, buff.get());
}
E、可以将test函数的代码改成如下代码,会解决test函数内所有的问题:
std::pair<int, char*> test() {
static char buff[128];
sprintf(buff, "%d test", 99);
return std::make_pair(10, buff);
}
题解:
-
pair的第二个参数类型是地址,指向一个字符串; -
局部变量可以返回,但是局部变量的地址、引用不能返回,因为函数调用结束后局部变量会被释放; -
static修饰局部变量,会改变变量的存放位置,从栈空间变成数据段。
五
下列代码中的输出是():
class Base {
public:
Base()
{
cout<<"Constructing Base \n";
}
~Base()
{
cout<<"Destructing Base \n";
}
};
class Derived: public Base {
public:
Derived()
{
cout<<"Constructing Derived \n";
}
~Derived()
{
cout<<"Destructing Derived \n";
}
};
int main(void)
{
Derived *d = new Derived();
Base *b = d;
delete b;
return 0;
}
A、
Constructing Base
Constructing Derived
Destructing Base
B、
Constructing Base
Constructing Derived
Destructing Derived
Destructing Base
C、
Constructing Base
Constructing Derived
Destructing Base
Destructing Derived
D、
Constructing Derived
Constructing Base
Destructing Base
Destructing Derived
题解:
创建派生类对象的时候,会先调用基类构造函数;
代码中的基类和派生类没有构成多态,所以释放对象的时候,编译器根据指针类型调用相应的析构函数。
六
以下哪种方法可以用来清理僵尸进程()。
A、向僵尸进程发送SIGKILL信号
B、向init进程发送SIGKILL信号
C、向僵尸进程的父进程发送SIGKILL信号
D、向僵尸进程发送SIGCHILD信号
答案:C
题解:
七
一棵二叉树的前序遍历结果为ABCDEFG,则其中序遍历结果不可能为?()
A、CBDAFEG
B、CBAEDGF
C、CBAEDFG
D、CBFADEG
答案:C
一棵二叉树的中序、后序遍历结果,就是中序遍历、后序遍历时候元素的出栈顺序。
所以这个问题就变成了,如果给定一个栈,入栈顺序是ABCDEFG,那么下面哪种出栈顺序是不可能的。
八
已知现有一个大小为4初始状态为空的栈,现在有一组数据经过这个栈后,最终的数据顺序是:2 5 4 1 3,问原始的进栈数据不可能是以下的哪组()
A、1 4 5 2 3
B、5 2 3 1 4
C、3 4 5 2 1
D、4 1 3 5 2
答案:D
选项D:因为 2 最先出栈,所以进栈顺序只能是 4 1 3 5 2,很显然超出了栈的容量。
九
序列{20, 23, 28, 41, 61, 31, 71, 76, 15, 30}构造为完全二叉树,完全二叉树再变为最小堆后,堆所对应的的中序遍历序列可能为()
A、76, 23, 41, 61, 20, 30, 31, 15, 28, 71
B、76, 23, 41, 20, 61, 30, 15, 31, 28, 71
C、76, 20, 41, 23, 30, 61, 15, 31, 28, 71
D、76, 23, 20, 41, 61, 15, 31, 20, 28, 71
答案:B
完全二叉树:
最小堆:
十
class Parent {
public:
Parent() { std::cout << "1"; }
Parent(const Parent &p) { std::cout << "2"; }
const Parent &operator=(const Parent &p) {
std::cout << "3";
return *this;
}
};
int main() {
Parent p;
Parent p1(p);
Parent p2 = p;
p2 = p1;
}
以上代码的输出为:
A、1123
B、1223
C、1233
D、1322
E、1332
答案:B
十一
有如下递归函数 test(n),其时间复杂度为多少?()
int test(int n) {
if (n <= 1) return 1;
return (2 * test(n - 1) + 3 * test(n - 2));
}
A、O(logn)
B、O(nlogn)
C、O(n^2)
D、O(n^3)
E、O(2^n)
答案:E
十二
关于以下代码说法正确的有?()
using namespace std;
class A {
public:
virtual void testA() = 0;
virtual void print() = 0;
};
class B :public A
{
public:
virtual void testA() = 0;
virtual void print() override
{
std::cout << "B::print" << std::endl;
}
virtual void testB()
{
std::cout << "testB" << std::endl;
}
};
class C :public B
{
public:
virtual void testA(){}
virtual void print() override
{
std::cout << "C::print" << std::endl;
}
};
int main() {
C c;
c.print();
c.testB();
return 0;
}
A、会出现编译出错
B、会成功输出C::print 以及 testB
C、main函数里可以生成B的对象,代码不会报错
D、main函数里可以生成A的对象,代码不会报错
答案:B
题解:
A和B都是抽象类,不会产生对象;
代码中并没有多态,因为没有基类指针指向派生类对象。
十三
假设一个数组采用快速排序,则下面的选项中,不可能是第3趟排序结果的是()
A、4, 8, 6, 10, 12, 16, 14
B、10, 4, 6, 8, 12, 14, 16
C、8, 4, 6, 12, 10, 14, 16
D、4, 8, 6, 12, 10, 16, 14
答案:ACD
快速排序以某个数字作为基数,一趟排序后,要求该数字前面的数字都比该数字小,后面的数字都比该数字大,而且该数字已经“就位”,就是待在了最终应该在的位置上。所以经过 3 趟排序后,起码有 3 个符合要求的数字。
十四
某进程创建的若干个线程,这些线程不能共享的是()
A、程序计数器
B、某线程的栈指针
C、进程打开的文件
D、全局变量
E、进程的堆空间
答案:AB
十五
tcp发送报文数据时,可能将多个数据包合并成一个大的数据包发送,就有可能发生粘包问题。以下可以用来解决这个问题的是程不能共享的是?()
A、发送固定长度的消息
B、包结尾增加分隔符
C、慢开始算法
D、把消息分成消息头和消息体,其中消息头上包含长度
E、利用滑动窗口实现控制
答案:ABD
同学们:
2021年学益得智能硬件暑期集训营即将开启,如果你有提升需求,那就赶紧抓住机会。我们有实战派老师倾囊相授,一定能助你在秋招走上人生巅峰!
以上是关于百度 | 2021校招C++研发工程师笔试详解的主要内容,如果未能解决你的问题,请参考以下文章
题解百度2021校招Web前端工程师笔试卷(第一批):单选题多选题
题解百度2020校招Web前端工程师笔试卷(第三批):单选题多选题