[秋招笔试]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 匹配,匹配度为 。因此最小匹配度为

数据范围

  • 字符串长度

题解

这道题的核心是理解"匹配度"的定义,并找到让匹配度最小的策略。

首先明确一下问题:给定两个字符串 ,小毛可以选择先输出哪一个。如果小毛先输出 ,小兰输出 ,那么匹配度就是 的后缀与 的前缀能够匹配的最长长度;反之亦然。

这个问题的关键观察是:小毛有两种选择,他会选择让匹配度更小的那个。因此,答案就是这两种情况中的较小值。

具体来说,需要计算两个值:

  1. 的后缀与 的前缀的最长匹配长度
  2. 的后缀与 的前缀的最长匹配长度

然后取这两个值的最小值。

如何计算后缀与前缀的最长匹配长度呢?最直接的方法是枚举所有可能的匹配长度 (从 ),对于每个 ,检查第一个字符串的最后 个字符是否与第二个字符串的前 个字符相同。

时间复杂度分析:对于每个 ,检查需要 的时间,总共有 要检查,因此总时间复杂度为 。对于字符串长度不超过 的数据范围,这个复杂度是完全可以接受的。

当然,也可以使用 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%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务