【秋招笔试】2025.09.07虾皮秋招笔试真题改编

✅ 秋招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🌸 目前本专栏已经上线180+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

虾皮

题目一:文档检索系统

1️⃣:将目标字符串去除空格得到纯净匹配串

2️⃣:使用双指针在源字符串中进行匹配,跳过空格字符

3️⃣:记录匹配成功时的起始和结束位置

难度:中等

这道题目的核心在于理解如何在忽略空格的情况下进行字符串匹配。通过双指针技术,我们可以高效地处理空格并找到第一个匹配位置,时间复杂度为 O(n×m)。

题目二:古董交易最大收益

1️⃣:解析数组格式的输入字符串

2️⃣:维护到目前为止的最低买入价格

3️⃣:计算每一天卖出能获得的最大利润

难度:中等

这是一道经典的动态规划问题,关键在于理解只需要一次遍历就能找到最优解。通过维护最低价格和最大利润两个变量,可以实现 O(n) 时间复杂度的高效解法。

题目三:密码字符重排系统

1️⃣:提取字符串中所有的小写字母

2️⃣:将提取的小写字母进行反转

3️⃣:按原位置将反转后的字母填回字符串

难度:中等

这道题目需要理解字符位置变换的规则,关键是只对小写字母进行整体反转而保持其他字符不变。通过提取-反转-填回的三步策略,可以优雅地解决问题。

01. 文档检索系统

问题描述

小兰正在开发一个智能文档检索系统。系统需要在一个源文档中查找指定的关键词片段,但文档中可能包含一些格式化的空格。为了提高用户体验,系统需要忽略空格的影响进行匹配。

给定源文档字符串 和查询关键词 ,你需要在 中查找 的开始位置(包含)和结束位置(不包含),忽略任何空格差异。如果关键词在源文档中找到,返回 ,否则返回 。如果 中多次出现,则返回第一次出现的位置。

假定: 都仅由字符 和空格组成,并且至少有一个非空格字符。

输入格式

输入包含两行:

第一行表示字符串

第二行表示字符串

输出格式

输出一个区间

样例输入

aac
aab
abc sh op ee ddd
shopee

样例输出

-1,-1
4,12

tips: 这里如果有多组输入输出,注意输入输出一一对应

数据范围

样例 解释说明
样例1 在字符串"aac"中查找"aab",由于不存在匹配,返回[-1,-1]
样例2 在"abc sh op ee ddd"中查找"shopee",忽略空格后在位置4-12找到匹配

题解

这道题的核心思路是双指针匹配。首先我们需要理解题目要求:在源字符串中查找目标字符串,但要忽略空格的影响。

解题步骤如下:

  1. 将目标字符串去除所有空格,得到纯净的匹配串
  2. 遍历源字符串的每个非空格字符作为起点
  3. 使用双指针同时在源字符串和目标字符串中移动
  4. 遇到源字符串中的空格就跳过,字符不匹配则失败
  5. 当目标字符串完全匹配时,记录起始和结束位置

关键技巧是在匹配过程中正确处理空格:源字符串中的空格需要跳过,但要保持位置索引的正确性。

时间复杂度为 ,其中 是源字符串长度, 是目标字符串长度。对于给定的数据范围,这个复杂度完全可以接受。

参考代码

  • Python
import sys
input = lambda: sys.stdin.readline().strip()

# 读取输入
src = input()
tgt = input()

# 去除目标字符串中的空格
clean_tgt = ''.join(c for c in tgt if c != ' ')

n, m = len(src), len(clean_tgt)
found = False

# 遍历源字符串的每个非空格起点
for i in range(n):
    if src[i] == ' ':
        continue
    
    # 双指针匹配
    si, ti = i, 0
    start_pos = -1
    
    while si < n and ti < m:
        if src[si] == ' ':  # 跳过空格
            si += 1
            continue
        
        if src[si] != clean_tgt[ti]:  # 字符不匹配
            break
        
        if start_pos == -1:  # 记录开始位置
            start_pos = si
        
        si += 1
        ti += 1
    
    # 检查是否完全匹配
    if ti == m:
        print(f"{start_pos},{si}")
        found = True
        break

if not found:
    print("-1,-1")
  • Cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    string src, tgt;
    getline(cin, src);
    getline(cin, tgt);
    
    // 去除目标字符串中的空格
    string clean;
    for (char c : tgt) {
        if (c != ' ') clean.push_back(c);
    }
    
    int n = src.size(), m = clean.size();
    
    // 遍历源字符串寻找匹配
    for (int i = 0; i < n; ++i) {
        if (src[i] == ' ') continue;  // 只从非空格字符开始
        
        int si = i, ti = 0, start = -1;
        
        // 双指针匹配过程
        while (si < n && ti < m) {
            if (src[si] == ' ') {
                si++;
                continue;
            }
            
            if (src[si] != clean[ti]) break;  // 匹配失败
            
            if (start == -1) start = si;  // 记录起始位置
            si++;
            ti++;
        }
        
        // 检查是否完全匹配成功
        if (ti == m) {
            cout << start << "," << si << '\n';
            return 0;
        }
    }
    
    cout << "-1,-1\n";
    return 0;
}
  • Java
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String src = br.readLine();
        String tgt = br.readLine();
        
        // 去除目标字符串中的空格
        StringBuilder clean = new StringBuilder();
        for (char c : tgt.toCharArray()) {
            if (c != ' ') clean.append(c);
        }
        
        int n = src.length(), m = clean.length();
        boolean found = false;
        
        // 遍历源字符串寻找匹配
        for (int i = 0; i < n && !found; i++) {
            if (src.charAt(i) == ' ') continue;
            
            int si = i, ti = 0, start = -1;
            
            // 双指针匹配过程
            while (si < n && ti < m) {
                if (src.charAt(si) == ' ') {
                    si++;
                    continue;
                }
                
                if (src.charAt(si) != clean.charAt(ti)) break;
                
                if (start == -1) start = si;  // 记录起始位置
        

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

评论
1
2
分享

创作者周榜

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