拼接最大 P&L 信号强度串
Build Largest P&L Signal-Strength String
开始编码信号组把每只股票的盘中 P&L 编成一个小的非负整数(「信号强度码」)。每天收盘要做一张排行榜:把所有 nums 中的码拼成一个长数字串,并选择能让这个整数最大的拼接顺序。给定 nums,请返回这个最大强度拼接串。
请实现 solution(nums: list[int]) -> str。把 nums 中的每个整数转成无前导零的十进制字符串,按某种顺序拼接,使得到的十进制串数值最大,并把这个串返回。若 nums 为空,返回 "0";若所有码都为 0,也返回 "0"(不是一串零)。
示例 1:solution([3, 30, 34, 5, 9]) 返回 "9534330"。排序为 [9, 5, 34, 3, 30] 后拼接得到 "9534330",比其他任何顺序都大。
示例 2:solution([3, 30]) 返回 "330",不是 "303"。按数值排序会把 30 放在 3 前面(30 > 3),但这是错的。正确做法是比较两种拼接结果:"3"+"30" = "330" vs "30"+"3" = "303";前者更大,所以 3 应排在前面。
示例 3:solution([0, 0, 0]) 返回 "0"。拼接结果 "000" 必须规范化为单字符 "0"。
干净的写法是自定义比较器:对任意两个字符串化的码 a 和 b,规定「a 排在 b 前」当且仅当 a + b > b + a(字符串拼接、字典序比较)。用 functools.cmp_to_key 包成排序 key 即可。两种拼接长度相同,所以字典序比较与数值比较等价,比较器满足传递性。整体 O(n log n) 次比较,每次比较扫描的字符数不超过 O(L)(L 是总位数);n ≤ 100 时远未触及上限。
约束条件
- 0 ≤ len(nums) ≤ 100
- 0 ≤ nums[i] ≤ 10⁹
- 返回结果为十进制数字串,无前导零(单字符 `"0"` 除外)
- 空输入返回 `"0"`
样例
Case 1 · canonical leetcode example
输入: [[3,30,34,5,9]]
期望: "9534330"
经典示例:按 a+b vs b+a 比较排序后拼接得到 9 > 5 > 34 > 3 > 30,串成 "9534330"。注意 3 应排在 30 前("330" > "303")。
Case 2 · the [3, 30] gotcha
输入: [[3,30]]
期望: "330"
比较 "3"+"30" = "330" 与 "30"+"3" = "303":前者更大,所以 3 应排在 30 之前。直接按数值比较会得到错误的 "303"。
Case 3 · all zeros — strip leading zeros to single 0
输入: [[0,0,0]]
期望: "0"
全是 0 时拼接结果是 "000",但需要把前导 0 折叠成 "0" 返回。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · canonical leetcode example
输入: [[3,30,34,5,9]]
期望: "9534330"
经典示例:按 a+b vs b+a 比较排序后拼接得到 9 > 5 > 34 > 3 > 30,串成 "9534330"。注意 3 应排在 30 前("330" > "303")。
Case 2 · the [3, 30] gotcha
输入: [[3,30]]
期望: "330"
比较 "3"+"30" = "330" 与 "30"+"3" = "303":前者更大,所以 3 应排在 30 之前。直接按数值比较会得到错误的 "303"。
Case 3 · all zeros — strip leading zeros to single 0
输入: [[0,0,0]]
期望: "0"
全是 0 时拼接结果是 "000",但需要把前导 0 折叠成 "0" 返回。