【备战秋招】25届大疆秋招笔试真题第二套
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线90+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
题目一:文件名版本解析
1️⃣:使用正则表达式匹配文件名格式
2️⃣:提取基础文件名、版本号和扩展名三个部分
3️⃣:处理特殊情况,如没有版本号的文件名
难度:简单
这道题目的关键在于理解文件名的结构模式,使用正则表达式来精确匹配和提取各个组成部分。通过模式匹配,可以有效地处理带版本号和不带版本号的两种文件名格式,实现 O(n×m) 的时间复杂度。
01. 文件名版本解析
问题描述
编写一个函数,接收一个包含多个文件名的字符串作为输入,返回一个元组的列表。列表中的每个元组包含文件名、扩展名以及文件名中的版本号。
文件名的版本号格式为 _v
,例如 file_v2.txt
。如果文件名中没有版本号,则版本号返回数字 。
输入格式
第一行包含一个字符串,格式为用逗号和空格分隔的多个文件名,例如 'file_v1.txt', 'file_v2.txt'
。
输出格式
输出一个元组的列表,每个元组包含三个元素:文件名(不含版本号和扩展名)、扩展名、版本号(整数)。
样例输入
'file_v1.txt', 'file_v2.txt'
'document.pdf', 'image_v3.png', 'text.txt'
样例输出
[('file', 'txt', 1), ('file', 'txt', 2)]
[('document', 'pdf', 0), ('image', 'png', 3), ('text', 'txt', 0)]
数据范围
- 文件名长度不超过
个字符
- 文件名数量不超过
个
- 版本号范围为
- 扩展名长度不超过
个字符
样例 | 解释说明 |
---|---|
样例1 | 两个文件都有版本号,分别是 v1 和 v2,扩展名都是 txt |
样例2 | document.pdf 没有版本号返回 0,image_v3.png 有版本号 3,text.txt 没有版本号返回 0 |
题解
这道题的核心是解析文件名的结构,提取出基础文件名、版本号和扩展名三个部分。
首先分析文件名的格式:
- 基本格式:
文件名.扩展名
- 带版本号格式:
文件名_v数字.扩展名
解题思路很直接:使用正则表达式来匹配这种模式。正则表达式 ^(.*?)(?:_v(\d+))?\.(\w+)$
可以完美解决这个问题:
^(.*?)
匹配文件名的主体部分(非贪婪匹配)(?:_v(\d+))?
可选地匹配版本号部分,\d+
捕获数字\.(\w+)$
匹配扩展名部分
处理步骤:
- 解析输入字符串,提取出所有文件名
- 对每个文件名应用正则表达式
- 如果匹配成功,提取三个组:基础文件名、版本号、扩展名
- 如果版本号不存在,设置为 0
- 返回结果列表
特殊情况处理:
- 文件名以
_v
结尾但没有数字:需要将_v
从基础文件名中移除 - 文件名完全不匹配正则:返回原文件名和空扩展名
时间复杂度为 ,其中
是文件名数量,
是单个文件名的平均长度。对于给定的数据范围,这个复杂度完全可以接受。
参考代码
- Python
import sys
import re
def parse_files(file_str):
# 解析输入字符串,提取文件名列表
files = eval(file_str)
res = []
# 正则表达式匹配文件名格式
pat = re.compile(r"^(.*?)(?:_v(\d+))?\.(\w+)$")
for f in files:
m = pat.match(f)
if m:
base = m.group(1) # 基础文件名
ver = int(m.group(2)) if m.group(2) else 0 # 版本号
ext = m.group(3) # 扩展名
# 处理特殊情况:文件名以_v结尾但无版本号
if base.endswith('_v') and ver == 0:
base = base[:-2]
res.append((base, ext, ver))
else:
# 不匹配的情况
res.append((f, '', 0))
return res
# 读取输入并处理
input_str = input().strip()
result = parse_files(input_str)
print(result)
- Cpp
#include
#include
#include
#include
#include
using namespace std;
// 解析单个文件名的函数
tuple parse_file(const string& fname) {
// 正则表达式匹配文件名格式
regex pat(R"(^(.*?)(?:_v(\d+))?\.(\w+)$)");
smatch m;
if (regex_match(fname, m, pat)) {
string base = m[1].str();
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力