一位科研人员在进行一系列实验后,得到了大量的以字母和数字混合命名的数据文件,例如 `Exp-A-Run1`, `Exp-A-Run01`, `Exp-A-Run10` 等。 标准的按文件名排序(字典序)会错误地将 `Exp-A-Run10` 排在 `Exp-A-Run2` 之前,这给数据分析带来了不便。 为了解决这个问题,需要一个能够理解数字真实大小的“自然排序”程序。 您能否编写一个程序,对给定的 N 个文件名进行这种特殊的自然排序? 排序规则: 程序需要从左到右逐段比较两个文件名 A 和 B : 1. 分段处理 :将文件名分割成“连续的非数字字符串”和“连续的数字字符串”段落。例如,`ts010tc12` 被视为 `["ts", "010", "tc", "12"]`。 2. 逐段比较 : 如果 A 和 B 的当前段都是非数字串,则按字典序(区分大小写)进行比较。如果不同,则排序完成。 如果 A 和 B 的当前段都是数字串,则将它们转换为整数值进行比较。如果数值不同,则排序完成。 如果一个是数字串,另一个是非数字串,则规定数字串排在前面。 3. 前缀优先 :如果一个文件名是另一个文件名的前缀(例如 `test` 和 `testcase1`),则较短的前缀名排在前面。 4. 稳定性 :排序必须是稳定的。如果根据以上所有规则,两个文件名被认为是等价的(例如 `Run01` 和 `Run1`),它们在输入中的原始相对顺序必须在输出中保持不变。
第一行:一个整数 N ,代表待排序的文件名数量。 ( 1 ≤ N ≤ 100 ) 接下来 N 行:每行一个文件名 F_i 。 文件名仅包含大小写字母和数字。 文件名长度在 [1, 127] 范围内。 文件名中任意连续的数字串长度不超过 9。
共 N 行,每行输出一个排序后的文件名。
3 ts1tc1 ts1tc01 ts0tc1
ts0tc1 ts1tc1 ts1tc01
2 testcase10 testcase9
testcase9 testcase10
3 ts09sc1 ts01tc1 ts010tc12
ts01tc1 ts09sc1 ts010tc12
考点:排序
数据规模 N ≤ 100 | 限制 3 秒 / 512MB | 标准输入输出
参考方向:排序
先用 O(n log n) 排序把无序变有序,后续处理往往就简单了。
思路框架(排序 通法 · 非本题专属)
实现要点:在 C++ 中用 std::sort,Python 用 sorted();注意自定义比较函数的严格弱序。
复杂度:时间 O(n log n) | 空间 O(log n) ~ O(n)
该范式的通法易错点
对照本题
本题在源数据中没有官方考点标签,方向由题面特征推断,仅供参考。
样例 1
3 / ts1tc1 / ts1tc01 / ts0tc1ts0tc1 / ts1tc1 / ts1tc01样例 2
2 / testcase10 / testcase9testcase9 / testcase10解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:2025年秋招-华为-12月17号开发岗。