通过率 66% · 提交 378 · 通过 251
小组中每个人都有一张卡片,卡片上是6位以内的正整数,组员将卡片连起来可以组成多种数字。计算可以组成的最大数字。
这类题属于华为 OD 机考真题方向中「100分 / 排序」方向的高频题型,通常考察对「100分 / 排序」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
由,分割的多个正整数字符串,不需要考虑非数字异常情况。小组中最多有25个人。
最大数字字符串
示例 1
输入示例
22,221
输出示例
22221
示例 2
输入示例
22,223
输出示例
22322
示例 3
输入示例
4589,101,41425,9999
输出示例
9999458941425101
示例 4
输入示例
3,30
输出示例
330
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
注意,本题和 经典题型. 最大数 完全相同。
很容易想到,在排序这些数字时,需要把 高位(以个位为低位算起)大的数 尽可能 贪心 地排序到最前面。这样才能尽可能地让整个字符串排序后得到的数字尽可能大。
例如,考虑示例三:
我们自然会想先让 9999 排到最前面,然后是 4589,然后是 41425,最后才是 101。
这其实是基于以下逻辑:对于两个特定的字符串 x 和 y,它们可以以 x + y 的方式拼接,也可以以 y + x 的方式拼接。显然这两个拼接后的字符串长度相等。在选择排序先后顺序时,我们总是期望能够拼接出 转化为数字之后,数字序更大的那个字符串。
如果把这个思路写成一个函数 compare:
其中 compare(x, y) 的返回值含义如下:
x 要排在 y 前面y 要排在 x 前面这是因为 compare 函数的返回值定义了两个元素的相对大小,就像在数值比较时:
x < y 时返回负值(如 -1),说明 x 应该排在 y 前面x > y 时返回正值(如 1),说明 y 应该排在 x 前面x == y 时返回 0,说明 x 和 y 相对位置无关紧要简单来理解:
compare(x, y) 函数返回 负数(如 -1)时,排序的顺序和传参的顺序一致compare(x, y) 函数返回 正数(如 1)时,排序的顺序和传参的顺序相反在 Python 中,我们可以通过导入 functools 中的 cmp_to_key 函数来结合 compare 函数实现这样的排序。
具体代码如下:
如果我们把上述 compare() 函数抽象为一个包含两个参数的 lambda 匿名函数,还可以写成这样:
此处的 lambda 匿名函数和 compare() 函数一样,必须包含 x 和 y 两个参数。其返回的结果 int(y + x) - int(x + y) 表示:
y + x 的拼接结果大于 x + y,则返回一个 正数,所以排序顺序和传参顺序相反,y 要排在 x 前面y + x 的拼接结果小于 x + y,则返回一个 负数,所以排序顺序和传参顺序相同,x 要排在 y 前面y + x 的拼接结果等于 x + y,则返回 0,x 和 y 的顺序无关紧要那么也能得到和上述 compare() 函数一样的计算结果。
需要特别注意的是,这是在 Python 写法中,极少数无法仅使用 lambda 匿名函数,而必须使用 `cmp_to_key()` 函数来辅助进行排序的题目。
cmp_to_key 的这种排序风格,是 基于两个元素之间的关系 而不是简单的基于单个元素的数字大小、字母顺序或者和自身元素值直接相关的某个指标来进行排序。
而在 C++、Java 等其他主流语言中,cmp_to_key 的这种基于两个元素之间关系的排序风格其实非常常见。
复杂度分析 设 n 为卡片(切割出的字符串)的数量,L 为单个数字字符串的最大长度。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有