[秋招笔试]2025.10.19-百度第一套-机考改编题
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线180+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
2025.10.19-百度第一套
题目一:故事接龙游戏
1️⃣:计算第一个字符串后缀与第二个字符串前缀的最长匹配长度
2️⃣:计算第二个字符串后缀与第一个字符串前缀的最长匹配长度
3️⃣:取两者中的最小值作为答案
难度:简单
这道题目的核心在于理解"接龙"的概念,即前一个字符串的结尾要和后一个字符串的开头匹配。通过枚举所有可能的匹配长度,找出两种接龙方式中得分较小的那个。时间复杂度 ,对于给定的数据范围完全可行。
题目二:团队效能评估
1️⃣:使用单调栈找出每个元素左右两侧第一个更小的元素
2️⃣:计算每个元素作为最小值时能控制的最大区间长度
3️⃣:反向遍历让较小窗口继承较大窗口的答案
难度:中等
这道题目需要理解"木桶效应"原理,并运用单调栈这一数据结构来高效求解。关键在于转换思路:不是枚举每个窗口,而是枚举每个元素作为最小值能控制的范围。通过单调栈可以在 时间内完成计算,是一个典型的优化问题。
01. 密码链接游戏
问题描述
小兰正在开发一个密码生成系统。在这个系统中,有两个核心密码串需要进行拼接测试。
系统的规则是这样的:小毛可以选择先输出第一个密码串或第二个密码串,小兰必须输出另一个。系统会自动计算"拼接匹配度" ,其定义为:小毛输出的密码串的后
位与小兰输出的密码串的前
位完全相同的最大
值。
例如,若小毛输出密码串 ,小兰输出密码串
,那么匹配度
需要满足
的后
个字符与
的前
个字符完全相同。
小毛希望选择一个策略,使得最终的匹配度尽可能小。请你帮他计算出最小的匹配度是多少。
输入格式
输入包含两行,每行一个仅包含小写字母的字符串,分别代表系统中的两个密码串。
输出格式
输出一个整数,表示可能获得的最小匹配度。
样例输入
ababab
babaa
样例输出
1
| 样例 | 解释说明 |
|---|---|
| 样例1 | 如果小毛输出 ababab,小兰输出 babaa,后缀 bab 与前缀 bab 匹配,匹配度为 babaa,小兰输出 ababab,后缀 a 与前缀 a 匹配,匹配度为 |
数据范围
字符串长度
题解
这道题的核心是理解"匹配度"的定义,并找到让匹配度最小的策略。
首先明确一下问题:给定两个字符串 和
,小毛可以选择先输出哪一个。如果小毛先输出
,小兰输出
,那么匹配度就是
的后缀与
的前缀能够匹配的最长长度;反之亦然。
这个问题的关键观察是:小毛有两种选择,他会选择让匹配度更小的那个。因此,答案就是这两种情况中的较小值。
具体来说,需要计算两个值:
的后缀与
的前缀的最长匹配长度
的后缀与
的前缀的最长匹配长度
然后取这两个值的最小值。
如何计算后缀与前缀的最长匹配长度呢?最直接的方法是枚举所有可能的匹配长度 (从
到
),对于每个
,检查第一个字符串的最后
个字符是否与第二个字符串的前
个字符相同。
时间复杂度分析:对于每个 ,检查需要
的时间,总共有
个
要检查,因此总时间复杂度为
。对于字符串长度不超过
的数据范围,这个复杂度是完全可以接受的。
当然,也可以使用 KMP 算法优化到 ,但对于这道题的数据规模来说,朴素算法已经足够高效。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
def calc(a, b):
# 计算字符串a的后缀与字符串b的前缀的最长匹配长度
n, m = len(a), len(b)
ans = 0
# 枚举所有可能的匹配长度
for k in range(1, min(n, m) + 1):
match = True
# 检查a的后k个字符与b的前k个字符是否相同
for i in range(k):
if a[n - k + i] != b[i]:
match = False
break
if match:
ans = k
return ans
# 读入两个字符串
s = input()
t = input()
# 计算两种情况的匹配度,取最小值
res1 = calc(s, t)
res2 = calc(t, s)
print(min(res1, res2))
- Cpp
#include <bits/stdc++.h>
using namespace std;
// 计算字符串a的后缀与字符串b的前缀的最长匹配长度
int calc(const string &a, const string &b) {
int n = a.size(), m = b.size();
int ans = 0;
// 枚举所有可能的匹配长度
for (int k = 1; k <= min(n, m); k++) {
bool ok = true;
// 检查a的后k个字符与b的前k个字符是否相同
for (int i = 0; i < k; i++) {
if (a[n - k + i] != b[i]) {
ok = false;
break;
}
}
if (ok) ans = k;
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s, t;
cin >> s >> t;
// 计算两种情况的匹配度,取最小值
int res1 = calc(s, t);
int res2 = calc(t, s);
cout << min(res1, res2) << "\n";
return 0;
}
- Java
import java.util.*;
public class Main {
// 计算字符串a的后缀与字符串b的前缀的最长匹配长度
static int calc(String a, String b) {
int n = a.length(), m = b.length();
int ans = 0;
// 枚举所有可能的匹配长度
for (int k = 1; k <= Math.min(n, m); k++) {
boolean ok = true;
// 检查a的后k个字符与b的前k个字符是否相同
for (int i = 0; i < k; i++) {
if (a.charAt(n - k + i) != b.charAt(i)) {
ok = false;
break;
}
}
if (ok) ans = k;
}
return ans;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
String t = sc.next();
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力
格力公司福利 219人发布