滴滴 2024 秋招研发岗笔试(22 题)
点击「查看答案」展开答案解析。
来源: 牛客原题 | 题量: 22 题
第1题(单选题) 求最长公共子序列可以使用( )解决 A. 回溯法 B. 分治策略 C. 动态规划 D. 贪心算法
查看答案
答案:C(动态规划)
最长公共子序列(LCS)是经典动态规划问题,dp[i][j] 表示两串前 i、j 个字符的 LCS 长度,dp[i][j] = dp[i-1][j-1]+1(相等时)或 max(dp[i-1][j], dp[i][j-1])。
第2题(单选题) 在长度为75的有序表中使用二分搜索法查找指定元素时,最多比较( )次 A. 4 B. 5 C. 6 D. 7
查看答案
答案:D(7) 二分查找最多比较次数 = ⌊log₂n⌋ + 1 = ⌊log₂75⌋ + 1 = 6 + 1 = 7。
第3题(单选题) ( )可用于求有向图的强连通分量 A. Dijkstra算法 B. Floyd-Warshall算法 C. Kruskal算法 D. Tarjan算法
查看答案
答案:D(Tarjan算法) Tarjan 算法(或 Kosaraju)用于求有向图的强连通分量;Dijkstra 求单源最短路,Floyd-Warshall 求全源最短路,Kruskal 求最小生成树。
第4题(单选题) Alice和Bob约定的素数P=353,P的本原根a=3,Alice选择的私钥为97,则其对应的公钥为( ) A. 40 B. 160 C. 248 D. 其他几项都不对
查看答案
答案:A(40) Diffie-Hellman 密钥交换,公钥 = a^私钥 mod P = 3^97 mod 353 = 40(这是 DH 的经典示例,3^97 mod 353 = 40)。
第5题(单选题) epoll从事件集合中删除一个文件描述符使用( ) A. epoll_ctl() B. epoll_delete() C. epoll_create() D. epoll_wait()
查看答案
答案:A(epoll_ctl()) epoll_ctl() 配合 EPOLL_CTL_DEL 从事件集合删除 fd;epoll_create 创建实例,epoll_wait 等待事件。
第6题(单选题) 在Linux系统中由于某种原因被终止的进程,但进程的控制结构保留,该进程的状态是( ) A. 等待 B. 运行 C. 停止 D. 僵死
查看答案
答案:D(僵死) 进程被终止但 PCB(进程控制结构)仍保留、未被父进程回收,处于僵死(僵尸)状态。
第7题(单选题) 在Linux系统中以只读方式挂载文件系统为FAT32的USB磁盘,挂载目录/mnt/usb( ) A. mount -t vfat -o ro /mnt/usb /dev/sda1 B. mount -t vfat -o ro /dev/sda1 /mnt/usb C. mount -s vfat -o ro /dev/sda1 /mnt/usb D. mount -t auto /dev/sda1 /mnt/usb
查看答案
答案:B
mount 语法为 mount -t 类型 -o 选项 设备 挂载点,即 mount -t vfat -o ro /dev/sda1 /mnt/usb。
第8题(单选题) 某进程因需要使用打印机而处于阻塞状态,当打印机处于空闲状态,此时该进程状态将() A. 从就绪转为运行 B. 从运行转为就绪 C. 从运行转为阻塞 D. 从阻塞转为就绪
查看答案
答案:D(从阻塞转为就绪) 进程因等打印机而阻塞,打印机空闲后阻塞条件解除,转入就绪态等待调度(而非直接运行)。
第9题(单选题) 死锁的预防是利用打破死锁的必要条件来提前预防,这里的不包括() A. 互斥 B. 请求和保持 C. 不剥夺 D. 环路等待
查看答案
答案:A(互斥) 死锁四个必要条件:互斥、请求保持、不可剥夺、环路等待。预防死锁可打破后三者;互斥是资源固有属性,通常无法打破。
第10题(单选题) 下面对缺页调度算法描述错误的是() A. 一条指令在执行期间只可能发生一次缺页中断 B. 最佳置换算法淘汰不再使用或最远将来使用的页 C. 先进先出算法淘汰内存中停留时间最长的页 D. 最近最少使用算法淘汰最近一段时刻使用最少的页
查看答案
答案:A 一条指令可能访问多个页面(如跨页操作数),执行期间可能发生多次缺页中断,A 描述错误。
第11题(单选题) 如果存在数据库myDB,则删除该数据库。下面SQL语句正确的是:( ) A. drop database if exists myDB; B. delete database if exists myDB; C. truncate database if not exists myDB; D. erasure database if no exists myDB;
查看答案
答案:A
删除数据库用 DROP DATABASE [IF EXISTS] db_name;。
第12题(单选题) 请为横线处选择合适的程序,使得程序的运行结果是7 8( )
class Base {
int a;
public:
Base(int x) {
a = x;
}
virtual void show() {
cout << a << " ";
}
};
class Derived: public Base {
int c;
public:
Derived(int
x, int y): Base(x) {
c = y;
}
void show() {
Base::show();
cout << c << " " << endl;
}
};
int
main() {
Derived D1(7, 8);
Base _____________ ;
p->show();
return 0;
}
A. *p=&D1 B. p=&D1 C. p=D1 D. &p=D1
查看答案
*答案:A(p=&D1)
Base _____________; 需声明基类指针并用派生类对象初始化,即 Base *p = &D1;,横线处填 *p=&D1。
第13题(单选题) 下列类定义,关于运算符重载函数的声明,有语法错误的是( )
class point {
int x, y;
public:
point(int v1, int v2) {
x = v1;
y = v2;
}
point operator+(point B); // 1
point operator++(int); // 2
point operator? : (); // 3
point operator=(point B); // 4
int GetX() {
return x;
}
int GetY() {
return y;
}
};
A. 1 B. 2 C. 3 D. 4
查看答案
答案:C(3)
operator? : 语法错误:C++ 中 ?:、.、::、sizeof、typeid 等运算符不能重载。
第14题(单选题) 分析下面代码,在选项中选出正确的可以填入横线处的代码()
class Outter {
private int a;
class Inner {
public int b;
public void
m() {
int c = a;
}
}
public void m() {
_________代码处 _________
}
}
A. int m = b; B. int m = a; C. int m = c; D. int m = m;
查看答案
答案:B(int m = a;)
外部类的方法可直接访问自身私有字段 a;b 需先 new Inner(),c 是内部类方法局部变量,m 是方法名,均不可用。
第15题(单选题) 在 Java 继承中关于构造方法描述正确的是( ) A. 子类会继承父类的构造方法 B. 子类只能继承父类的公共的构造方法 C. 类可以通过super关键字调用父类的构造方法 D. 子类只能调用自己的构造方法
查看答案
答案:C
构造方法不被继承;子类可通过 super(...) 显式调用父类构造方法(且必须作为构造器第一条语句)。
第16题(单选题) 下列代码中,输出正确结果是( )
public interface Shape {
void draw();
}
public class Rectangle implements Shape {
public void draw() {
System.out.println("绘制矩形");
}
}
public class Circle implements Shape {
public void draw() {
System.out.println("绘制圆形");
}
}
public class Main {
public static void main(String[] args) {
Shape shape1 = new Rectangle();
Shape shape2 = new Circle();
shape1.draw();
shape2.draw();
}
}
A. 输出结果为:绘制矩形 绘制圆形 B. 输出结果为:绘制矩形 绘制矩形 C. 输出结果为:绘制圆形 绘制圆形 D. 输出结果为:绘制圆形 绘制矩形
查看答案
答案:A
多态:Shape shape1 = new Rectangle() 与 shape2 = new Circle(),调用各自重写的 draw(),依次输出「绘制矩形」「绘制圆形」。
第17题(单选题) 在Java 中下面类中定义构造方法正确的是( ) A. class Student{student(){ } } B. class Student{private Student(){ } } C. class Student{void Student(){ } } D. class Student{Student{ } }
查看答案
答案:B
构造方法需与类同名且无返回类型。private Student(){} 是合法(私有)构造方法;A 的 student() 只是普通方法,C 有 void 是普通方法,D 语法错误。
第18题(单选题) windows系统ctrl+z是撤销操作,linux系统ctrl+z是暂停程序。为了防止在linux系统编写程序时按ctrl+z挂起编辑器,需执行以下操作( ) A. trap ‘-’ STOP B. trap ’ ’ STOP C. trap ’ ’ QUIT D. trap ’ ’ INT
查看答案
答案:B(trap ’ ’ STOP)
Ctrl+Z 发送停止信号(SIGTSTP),用 trap 忽略该信号可防止程序被挂起;trap ' ' 信号(空命令)表示忽略。
第19题(单选题) 在MySQL数据库中去创建一个新表名为materials,三个字段分别是:id,description和cost。执行以下SQL语句: CREATE TABLE materials ( id INT AUTO_INCREMENT PRIMARY KEY, description VARCHAR(255), cost DECIMAL(19 , 4 ) NOT NULL ); INSERT INTO materials(description,cost) VALUES(‘Bicycle’, 50034),(‘Seat’,1023),(‘Break’,521); SELECT * FROM materials; 以下正确的输出是:( ) A. id description cost 1 Bicycle 500 2 Seat 10 3 Break 5 B. id description cost 1 Bicycle 5003 2 Seat 1023 3 Break 5210 C. id description cost 1 Bicycle 50034 2 Seat 1023 3 Break 521 D. id description cost 1 Bicycle 5003400 2 Seat 102300 3 Break 52100
查看答案
答案:C
DECIMAL(19,4) 精确存储数值,插入的 50034、1023、521 原样保存并输出,即 1 Bicycle 50034 / 2 Seat 1023 / 3 Break 521。
第20题(多选题) B树的特点是( ) A. B树是一种二叉搜索树 B. B树是一种多路搜索树 C. 每个节点最多只能包含两个子节点 D. 每个节点可以包含多个键值和子节点
查看答案
答案:B、D B 树是多路平衡搜索树(非二叉),每个节点可包含多个键值和多个子节点;A(二叉搜索树)、C(最多两个子节点)描述的是二叉搜索树。
第21题(编程题) 小美正在摆放她的收藏品。小美有一个漂亮的收藏架,有着一排 n 个格子,从左到右分别编号为 1 \sim n 。
小美打算把她的 m 个收藏品 放进这 n 个格子中,并且尽可能的让摆放好看。怎么样才算好看呢?
小美认为有对比才有美感,相邻两个格子收藏品数量之差越大就越美。形式化地讲,
我们认为如果第 i个格子里摆放了a_i个收藏品,那么美观度为 [图] 。
小美觉得有些格子不放收藏品也可以接受,即要求 [图]。请帮小美想出最美观的摆放方案! 输入描述:第一行一个整数 T 表示数据组数。 对于每组数据: 第一行2个整数分别为 n 和 m ,表示格子数量和收藏品数量。 对于40%的数据,1 \leq n,m \leq 50 对于80%的数据,1 \leq n,m \leq 50000, 1 \leq T \leq 20 对于100%的数据,1 \leq n,m \leq 10^9 , 1 \leq T \leq 20 输出描述:输出一行 T 个整数表示最大的美观度,数字间有空格隔开。 输入示例:3 1 50 2 2 3 1 输出示例:0 2 2
查看答案
思路 最大化相邻格子数量差之和。设美观度 = Σ|aᵢ−aᵢ₊₁|,且有 Σaᵢ = m、aᵢ ≥ 0。由 |x−y| ≤ x+y 可得总变差 ≤ 2m(取等时两端为 0、中间交替取 0/m)。
- n=1:无相邻格 → 0
- n=2:全放一格 → m
- n≥3:中间放 m、两端 0 → 2m
def beauty(n, m):
return 0 if n == 1 else (m if n == 2 else 2 * m)
第22题(编程题) 小明有一个长度为 n ,由前 k 个小写英文字母组成的字符串(保证 n 为偶数)。
小亮想在小明睡觉的时候把这个字符串用小明的零花钱消除干净。
小亮每次可以选择该串的两个相邻的字符删除,删除后将串拼上,并花掉小明一定数量的零花钱。
若某一次删除的相邻两个字符从左到右分别是 a 和 b ,则将花掉小明 cost(a,b) 块钱。小亮希望他花掉的零花钱尽可能多,帮帮小亮。 输入描述:第一行有两个整数 n,k(1 \leq n \leq 500 , 1 \leq k \leq 26),分别代表小明的字符串长度与字符串中的字符种类数(保证 n 为偶数且串的内容仅由前 k 个小写英文字母组成)。
接下来 k 行给出了一个 k \times k 的由整数构成的矩阵。 矩阵中第 i 行第 j 列的元素代表消除相邻的第 i 个字母和第 j 个字母所能花掉的钱数。
最后一行有一个长度为 n 的字符串,代表小明的字符串。 输出描述:输出一个值,代表小亮最多能花掉小明多少零花钱。 输入示例:4 3 0 1 3 2 0 0 0 0 0 abac 输出示例:5
查看答案
思路
每次删相邻两字符 = 求非交叉最大权匹配,区间 DP。dp[l][r] 表示完全消除子串 s[l..r] 的最大花费(区间长为偶数)。最后消除的一对必为 s[l] 与某个 s[m](m 与 l 奇偶性相同),中间 [l+1,m-1] 与右侧 [m+1,r] 先消除:
dp[l][r] = max( dp[l+1][m-1] + cost(s[l],s[m]) + dp[m+1][r] )
def max_cost(s, cost):
n = len(s)
dp = [[0]*n for _ in range(n)]
for length in range(2, n+1, 2):
for l in range(n-length+1):
r = l + length - 1
for m in range(l+1, r+1, 2):
a, b = ord(s[l])-97, ord(s[m])-97
left = dp[l+1][m-1] if m-1 >= l+1 else 0
right = dp[m+1][r] if m+1 <= r else 0
dp[l][r] = max(dp[l][r], cost[a][b] + left + right)
return dp[0][n-1]
复杂度 O(n³),n≤500 时建议用 C++。
—