百度23届秋招研发岗A卷 2024/12/16
1.下面关于 SparkSQL 中 Catalyst 优化器的说法正确的是(ABC)
A.Catalyst 优化器利用高级编程语言功能(例如 Scala 的模式匹配)来构建可扩展的查询优化器
B.Catalyst 包含树和操作树的规则集
C.Catalyst 有不同的规则集处理不同的查询阶段
D.Catalyst 没有特定的库来处理关系查询
2.编程题-小红走矩阵
小红拿到了一个字符矩阵,矩阵仅由'r'、'e'、'd'三种字符组成。她初始站在左上角,每次可以走到一个相邻的字符上(每个字符上、下、左、右最多4个相邻)。但有个限制,小红不能从'r'走到'd',从'e'走到'r',从'd'走到'e',其他情况都能走。
小红想知道,从左上角走到右下角至少需要多少步?
cpp
#include <bits/stdc++.h>
using namespace std;
/*
思路
类似于迷宫问题,最少移动步数 bfs寻找最优解
*/
int n,m;
char g[505][505];
bool vis[505][505];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
struct node{
int x,y,cnt=250001; //从原点到该位置的最短步数
};
//检查是否可以由b得到a
bool check(char a,char b){
if((a=='d'&&b=='r')||(a=='r'&&b=='e')||(a=='e'&&b=='d')) return false;
return true;
}
int bfs(int x,int y){
queue<node> q;
q.push({x,y,0});
vis[x][y]=1;
while(!q.empty()){
node now=q.front(); q.pop();
if(now.x==n&&now.y==m) return now.cnt;
for(int i=0;i<4;i++){
int nex=now.x+dx[i],ney=now.y+dy[i];
if(nex<=0||nex>n||ney<=0||ney>m) continue;
if(!vis[nex][ney]&&check(g[nex][ney],g[now.x][now.y])){
//可以移动
q.push({nex,ney,now.cnt+1});
vis[nex][ney]=1;
}
}
}
return -1;
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
string s;
cin>>s;
for(int j=0;j<m;j++){
g[i][j+1]=s[j];
}
}
cout<<bfs(1,1);
return 0;
}
3.下面关于 Spark 的说法错误的是(AD)
A.RDD 的特点:可分区、可序列化、可修改
B.Spark Job 默认的调度模式是 FIFO
C.Spark 比 MapReduce 框架性能快
D.Spark R 是 Spark 的四大组件之一
解析
RDD 的特点:可分区、可序列化、可持久化,不可修改
Spark 的四大组件:1、SparkStreaming:针对实时数据进行流式计算的组件;2、SparkSQL:用来操作结构化数据的组件;3:GraphX,Spark面向图计算提供的框架与算法库;4:MLlib,一个机器学习算法库。
4.如下4个选项表示了四种入栈次序,以及最少需要的栈空间len,最后保证都可以得到出栈序列"sequence",len值错误的是(C)
A.cneuqese 7
B.uqeseecn 4
C.seecneuq 5
D.eneesquc 5
5.一组记录的关键码为(21,88,19,45,13,25,66,33,18),则利用快速排序的方法,以第一个记录为基准,从小到大排序得到的一次划分结果为(B)
A.18,13,19,21,45,25,66,88,33
B.18,13,19,21,45,25,66,33,88
C.18,13,19,45,21,25,66,33,88
D.18,13,19,21,25,45,33,66,88
解析
首尾分别设置指针i和j,与基准元素比较,如果j指向元素小于基准,那么将j指向元素交换到前面,然后切换到i指针同理比较;如果j指向元素大于等于基准,那么位置不变,j--。
6.给定数组 [1,5,11,30,45,47,47,50],若要查找某一元素是否存在,使用二分查找,则至多需要查找(4)次。
7.当一个 B 类地址的子网掩码为 255.255.252.0,每个子网最多可以有多少主机数? 当一个 C 类地址的子网掩码为 255.255.255.252,每个子网最多可以有多少主机数(1022,2)
8.小明居家办公时需要将计算机本地的ssh公钥文件(id_rsa.pub)安装到实验室远程主机(root,ip 地址为:192:168:7:2)对应的账户下,可以通过以下哪个命令完成(C)
A.ssh-add -i ~/.ssh/id_rsa.pub root@192.168.7.2
B.ssh-agent -i ~/.ssh/id_rsa.pub root@192.168.7.2
C.ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.7.2
D.ssh-keygen -i ~/.ssh/id_rsa.pub root@192.168.7.2
解析
本题考查Linux的系统安全。
ssh-add适用于把专用密钥添加到ssh-agent的高速缓存中,A错误。
ssh-agent适用于保存公钥身份验证所使用的私钥,B错误。
ssh-copy-id可以把本地的ssh公钥文件安装到远程主机对应的账户下,C正确。
ssh-keygen适用于ssh生成、管理和转换认证密钥,D错误。
9.下列所给选项中,哪个不是MBR的组成部分(A)
A.开始标志
B.主引导程序
C.分区表
D.结束标志
解析
本题考查Linux的磁盘管理。
MBR主引导记录(Master Boot Record)由3个部分组成:
1)主引导程序,负责从活动分区中装载,并运行系统引导程序,B选项包括;
2)分区表,含4个分区项,每个分区表项长16字节,C选项包括;
3)结束标志,占2个字节,固定为55AA,D选项包括。
MBR是位于磁盘最前边的一段引导,没有开始标志,故题解为A。
10.牛牛系统中现在有三个进程,分别是牛1、牛2和牛3,这三个进程共享同一个缓冲区来完成消息处理,牛1负责把消息放入缓冲区,牛2负责在缓冲区中对消息进行加工,牛3负责把消息从缓冲区读出,现请问牛1和牛3之间的制约关系是(互斥和同步关系)、
解析
并发进程因为共享资源而产生相互之间的制约关系,可以分为两类:
①互斥关系,指进程之间因相互竞争使用独占型资源(互斥资源)所产生的制约关系;
②同步关系,指进程之间为协同工作需要交换信息、相互等待而产生的制约关系。
本题中两个进程之间的制约关系是同步关系,进程牛3必须在进程牛1将数据放入缓冲区后才能从缓冲区中读出数据。
此外,共享缓冲区是互斥访问的,所以它们也具有互斥关系。
11.关于下面 C++ 代码的执行结果说法正确的是(CD)
|-------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <iostream>
class
Test {
public``:
``Test() = ``default``;
``~Test() {
``std::cout << ``"~Test"
<< std::endl;
``}
``void
print1() {
``std::cout << ``"print1"
<< std::endl;
``}
``virtual
void
print2() {
``std::cout << ``"print2"
<< std::endl;
``}
};
int
main() {
``{
``Test *t = nullptr;
``t->print1();
``t->print2();
``}
``std::cout << ``"I'm OK"
<< std::endl;
``return
0;
}
|
A.程序输出中包含 ~Test
B.程序使用空指针调用 print1,因此会崩溃
C.程序使用空指针调用 print2,因此会崩溃
D.如果将 virtual 去掉,那么程序就能正常执行
解析
本题考察对象成员函数和虚函数的理解。
Test() = default;
表示编译器会自动生成一个默认构造函数,这个构造函数不接受任何参数,也不执行任何操作。
~Test()
是析构函数 ,当一个 Test
类的对象被销毁时(例如对象超出作用域、被删除等情况),这个析构函数就会被调用。
print1 是一个普通成员函数 ,保存在代码区,编译后已经存在,且没有使用类中的任何成员,因此可以使用空指针调用
print2 是一个虚函数 ,通过虚函数表进行定位,而虚函数表的指针需要对象创建才有,因此空指针调用虚函数无法找到虚函数表,会出现异常
如果将 print2 变为普通函数,那么就可以正常使用(print2 也没有使用任何类成员)。因此 D 选项正确。
12.下列说法中错误的是(BD)
A.不可以将构造函数声明为虚函数
B.当构造一个对象时先执行构造函数体内的内容,再初始化各个成员变量
C.构造函数不能带返回值,也不能返回void
D.类成员变量初始化顺序由构造函数初始化列表顺序决定
解析
构造函数不能被声明为虚函数,因为虚函数的调用依赖于虚表(vtable),而虚表是在对象构造完成后才被设置好的。因此,构造函数不能是虚函数。
B选项当构造一个对象时,先初始化各个成员变量,再执行构造函数体内的内容;D选项,类成员变量初始化顺序由成员变量在类定义中的声明顺序决定的;
构造函数不返回任何值,甚至连void
也不能作为返回类型。构造函数的目的是初始化对象,而不是返回值。
13.在 C++ 中,以下关于静态成员函数与普通成员函数区别,说法正确的是(ABC)
A.普通成员函数有 this 指针
B.普通成员函数可以访问类中任意成员
C.静态成员函数没有 this 指针
D.静态成员函数可以访问类中任意成员
解析
A. 普通成员函数有this指针 :正确。普通成员函数(非静态成员函数)确实有一个隐含的this
指针,它指向当前对象。这个this
指针是成员函数的第一个参数,虽然它不需要在函数参数列表中显式声明。
B. 普通成员函数可以访问类中任意成员:正确。普通成员函数可以访问类中的任意成员,包括静态成员和非静态成员。
C. 静态成员函数没有this指针 :正确。静态成员函数没有this
指针,因为静态成员函数不属于任何特定的对象,它们属于类本身。
D. 静态成员函数可以访问类中任意成员:错误。静态成员函数只能访问静态成员变量和其他静态成员函数。它不能直接访问非静态成员变量,因为非静态成员变量属于对象,而静态成员函数不属于任何特定的对象。
20.在Linux中,有一个名为test的文件如下所示,执行awk '{print $NF}' test命令将输出
(
1,2,3,4
5,6,7,8
9,10,11,12
end
)
test1 1,2,3,4
test2 5,6,7,8
tet3 9,10,11,12
tst4 13,14,15,16 end
解析
awk '{print $NF}'
是一个 awk 命令,用于打印每行的最后一个字段。
这里的**$NF
是一个特殊变量,表示当前行的最后一个字段**
当你运行这个命令时,awk 会读取输入的每一行,分割成字段(默认使用空白字符作为分隔符),然后打印每行的最后一个字段。
14.查询student_table中男生、女生的平均年龄(忽略age为NULL的记录),以下正确的是(B)
表中全部记录如下:
|----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 | +------+------------+------------+------+------+
| id | name | birth | sex | age |
+------+------------+------------+------+------+
| 1005 | | | NULL | 21 |
| 1006 | 王五 | 2000-08-06 | 女 | NULL |
| 1008 | 张三 | 2002-12-01 | 女 | 20 |
| 1010 | 李四 | 2001-01-01 | 男 | 23 |
| 1011 | 李四 | 2002-08-06 | 女 | 23 |
| 1012 | 张三 | 2001-12-01 | 女 | 20 |
| 1013 | 赵六 | 2000-09-06 | 男 | NULL |
|
A.SELECT sex ,average(age) FROM student_table WHERE sex IS NOT NULL GROUP BY sex ;
B.SELECT sex ,avg(age) FROM student_table WHERE sex IS NOT NULL GROUP BY sex ;
C.SELECT sex ,sum(age)/count(*) FROM student_table WHERE sex IS NOT NULL GROUP BY sex ;
D.SELECT sex ,sum(age)/count(sex) FROM student_table WHERE sex IS NOT NULL GROUP BY sex ;
解析
CD:错误,count(*)是全部记录,count(sex) 是sex不为NULL的记录,需要用【sum(age)/count(age)】才正确!!avg默认不计入NULL;
15. 如果要选择Student_A和Student_B表中公共部分,并按照class_id降序输出,请问该如何补全以下这段SQL语句(A)(注明:只需要输出Student_A或Student_B的student_id和student_name字段)SELECT student_id, student_name FROM Student_A __________________;
A.INTERSECT SELECT student_id, student_name FROM Student_B ORDER BY class_id DESC;
B.EXCEPT SELECT student_id, student_name FROM Student_B ORDER BY class_id DESC;
C.INTERSECT SELECT student_id, student_name FROM Student_B ORDER BY class_id;
D.NOT INTERSECT SELECT student_id, student_name FROM Student_B ORDER BY class_id DESC;
解析
可以使用INTERSECT获取两个集合中公共部分。
A选项正确,B选项使用的是EXCEPT表示差集不符合题意,C选项是升序排序不符合题意,D选项为非公共部分,不符合题意,故本题选择A。
16.下列关于SQL的描述,错误的是(D)
A.SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)
B.SQL 的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制
C.关系型数据库中,虽然存在着多种不同版本的 SQL 语言,但它们都以相似的方式共同地来支持一些主要的命令(比如 SELECT、UPDATE、DELETE、INSERT、WHERE)
D.Mysql、Oracle、Redis都是关系型数据库,都有相应的SQL语言
解析
Mysql和Oracle数据库是典型的关系型数据库,但Redis是非关系型数据库,是一个遵守BSD 协议的高性能的 key-value 键值对类型的数据库