华为 · 排序 · 算法编程题
华为 排序 N ≤ 100 时限 3 秒 / 512 MB

题目描述

一位科研人员在进行一系列实验后,得到了大量的以字母和数字混合命名的数据文件,例如 `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 组

样例 1
输入
3
ts1tc1
ts1tc01
ts0tc1
输出
ts0tc1
ts1tc1
ts1tc01
样例 2
输入
2
testcase10
testcase9
输出
testcase9
testcase10
样例 3
输入
3
ts09sc1
ts01tc1
ts010tc12
输出
ts01tc1
ts09sc1
ts010tc12

算法解析依据一般

考点:排序

数据规模 N ≤ 100 | 限制 3 秒 / 512MB | 标准输入输出

题目画像

  • 数据规模:N ≤ 100,n ≤ 9
  • 复杂度门槛:允许 O(n³) ~ O(n⁴) 的多重循环,可以放心枚举。
  • 源站时限:3 秒(牛客口径,非本题专属门槛)

解题思路

参考方向:排序

先用 O(n log n) 排序把无序变有序,后续处理往往就简单了。

思路框架(排序 通法 · 非本题专属)

  1. 排序后很多性质变简单:相邻关系、前缀性质、二分可行。
  2. 若题目禁止使用排序库函数,则手写快排/归并(归并还能顺带求逆序对)。
  3. 排序常与其他范式组合,比如「排序 + 贪心」「排序 + 二分」「排序 + 双指针」。

实现要点:在 C++ 中用 std::sort,Python 用 sorted();注意自定义比较函数的严格弱序。

复杂度:时间 O(n log n) | 空间 O(log n) ~ O(n)

该范式的通法易错点

  • 自定义比较函数不满足严格弱序会导致运行时崩溃。
  • 排序后丢失原始下标,题目需要下标时记得用 pair 一起排。

对照本题

  • 数据规模 N ≤ 100,允许 O(n³) ~ O(n⁴) 的多重循环,可以放心枚举。
本题在源数据中没有官方考点标签,方向由题面特征推断,仅供参考。

样例

样例 1

  • 输入:3 / ts1tc1 / ts1tc01 / ts0tc1
  • 输出:ts0tc1 / ts1tc1 / ts1tc01

样例 2

  • 输入:2 / testcase10 / testcase9
  • 输出:testcase9 / testcase10

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-12月17号开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解