题目描述
思路解析动画文字版
下面 15 步动画会按主解代码推进,而不是泛泛讲题型。
1. 读输入:输入 5 个数 3、30、34、5、9,目标是重排顺序拼成最大整数,每个数不可拆分。
2. 转成字符串:先把每个整数转成字符串,得到 arr = ["3","30","34","5","9"],后面用字符串拼接来比较。
3. 比较规则:关键规则:对相邻两数 a、b,比较拼接结果 a+b 与 b+a,哪个拼出来更大,谁就排前面。
4. 比较 3 与 30:比较 3 和 30:拼成 330 与 303,因为 330 大于 303,所以 3 应排在 30 前面。
5. 比较 3 与 34:比较 3 和 34:拼成 334 与 343,334 小于 343,所以 34 应排在 3 前面。
6. 比较 5 与 9:比较 5 和 9:拼成 59 与 95,59 小于 95,所以 9 应排在 5 前面。
7. 比较 9 与 34:比较 9 和 34:拼成 934 与 349,934 大于 349,9 排在 34 前面,9 是最该靠前的数。
8. 选出第 1 名:综合所有比较,9 与任意数拼接都最大,被放到第 1 位,标绿表示该位置已定。
9. 选出第 2 名:剩下数里 5 最强:5 与 34 拼成 534 大于 345,5 排到第 2 位,前两位已定 9、5。
10. 选出第 3 名:再看 34 与 3:343 大于 334,34 排到第 3 位,前三位已定 9、5、34。
11. 定第 4、5 名:最后 3 与 30:330 大于 303,3 排在 30 前。整个数组排序完成:9、5、34、3、30。
12. 排序完成:排序结束,arr = ["9","5","34","3","30"],每个相邻对都满足 a+b 不小于 b+a。
13. 拼接结果:把排好的字符串依次拼接:9 + 5 + 34 + 3 + 30,得到 ans = "9534330"。
14. 前导零检查:检查首位 ans[0] = "9" 不为 0,无需特判;若全是 0(如 [0,0])首位为 0 时要返回 "0"。
15. 返回答案:返回字符串 "9534330",即由这 5 个数能拼出的最大整数。
记住这题的代码骨架:题意约束先落到状态变量,再用循环或递归维护它。
参考代码
from functools import cmp_to_keyclass Solution: def largestNumber(self, nums): arr = list(map(str, nums)) def cmp(a, b): if a + b > b + a: return -1 if a + b < b + a: return 1 return 0 arr.sort(key=cmp_to_key(cmp)) ans = ''.join(arr) return '0' if ans[0] == '0' else ans复杂度
- 时间复杂度:O(n log n * L),排序比较拼接字符串
- 空间复杂度:O(nL),字符串数组
易错点
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
最接近原点的 K 个点
LeetCode 973 · 中等 · 沿着 排序套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题