[秋招笔试]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%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力
 查看12道真题和解析
查看12道真题和解析