【秋招笔试】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找到匹配 |
题解
这道题的核心思路是双指针匹配。首先我们需要理解题目要求:在源字符串中查找目标字符串,但要忽略空格的影响。
解题步骤如下:
- 将目标字符串去除所有空格,得到纯净的匹配串
- 遍历源字符串的每个非空格字符作为起点
- 使用双指针同时在源字符串和目标字符串中移动
- 遇到源字符串中的空格就跳过,字符不匹配则失败
- 当目标字符串完全匹配时,记录起始和结束位置
关键技巧是在匹配过程中正确处理空格:源字符串中的空格需要跳过,但要保持位置索引的正确性。
时间复杂度为 ,其中
是源字符串长度,
是目标字符串长度。对于给定的数据范围,这个复杂度完全可以接受。
参考代码
- 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%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力