← 返回编程题库
coding-build-largest-pnl-concat中等免费版2000ms未尝试

拼接最大 P&L 信号强度串

Build Largest P&L Signal-Strength String

开始编码

信号组把每只股票的盘中 P&L 编成一个小的非负整数(「信号强度码」)。每天收盘要做一张排行榜:把所有 nums 中的码拼成一个长数字串,并选择能让这个整数最大的拼接顺序。给定 nums,请返回这个最大强度拼接串。

请实现 solution(nums: list[int]) -> str。把 nums 中的每个整数转成无前导零的十进制字符串,按某种顺序拼接,使得到的十进制串数值最大,并把这个串返回。若 nums 为空,返回 "0";若所有码都为 0,也返回 "0"(不是一串零)。

示例 1solution([3, 30, 34, 5, 9]) 返回 "9534330"。排序为 [9, 5, 34, 3, 30] 后拼接得到 "9534330",比其他任何顺序都大。

示例 2solution([3, 30]) 返回 "330"不是 "303"。按数值排序会把 30 放在 3 前面(30 > 3),但这是错的。正确做法是比较两种拼接结果"3"+"30" = "330" vs "30"+"3" = "303";前者更大,所以 3 应排在前面。

示例 3solution([0, 0, 0]) 返回 "0"。拼接结果 "000" 必须规范化为单字符 "0"

干净的写法是自定义比较器:对任意两个字符串化的码 ab,规定「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 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

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" 返回。