百度 | 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


题解:

插入后的二叉排序树如图:

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





关于以下代码说法正确的有?


#include<iostream>#include <map>#include <memory>
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;}


A、a是临时变量,返回会被销毁,可能导致输出结果有问题
B、buff[128]是临时变量,返回会被销毁,可能导致输出结果有问题
C、my.insert(test());插入会报错
D、可以将test函数的代码改成如下代码,会解决test函数内所有的问题:

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);}


答案:BE

题解:


  1. pair的第二个参数类型是地址,指向一个字符串;
  2. 局部变量可以返回,但是局部变量的地址、引用不能返回,因为函数调用结束后局部变量会被释放;
  3. 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 BaseConstructing DerivedDestructing Base


B、

Constructing BaseConstructing DerivedDestructing DerivedDestructing Base


C、

Constructing BaseConstructing DerivedDestructing BaseDestructing Derived


D、

Constructing DerivedConstructing BaseDestructing BaseDestructing Derived



答案:A

题解:


  1. 创建派生类对象的时候,会先调用基类构造函数;

  2. 代码中的基类和派生类没有构成多态,所以释放对象的时候,编译器根据指针类型调用相应的析构函数。





以下哪种方法可以用来清理僵尸进程()。


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


题解:

完全二叉树:

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


最小堆:

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





#include <iostream>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


题解:




十二


关于以下代码说法正确的有?()


#include <iostream>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


题解:


  1. A和B都是抽象类,不会产生对象;

  2. 代码中并没有多态,因为没有基类指针指向派生类对象。



十三


假设一个数组采用快速排序,则下面的选项中,不可能是第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前端工程师笔试卷(第一批):单选题多选题

2022届互联网公司校招后端技术研发笔试

百度2019校招Web前端工程师笔试卷(第二批)

题解百度2020校招Web前端工程师笔试卷(第三批):单选题多选题

题解百度2020校招Web前端工程师笔试卷(第二批):单选题多选题

百度C++研发工程师面经