
题目分析LeetCode 179. 最大数给定一组非负整数 nums重新排列每个数的顺序每个数不可拆分使之组成一个最大的整数。注意 输出结果可能非常大所以你需要返回一个字符串而不是整数。示例输入nums [10, 2]输出“210”输入nums [3, 30, 34, 5, 9]输出“9534330”输入nums [0, 0]输出“0”不能返回 “00”核心思路这道题的本质是自定义排序。对于两个数字 a 和 b如何决定谁应该排在前面如果拼接 ab ba则 a 应该排在 b 前面如果拼接 ab “59” → “9” 排在前面“5” vs “34”“534” “345” → “5” 排在前面“3” vs “30”“330” “303” → “3” 排在前面“3” vs “34”“334” “12112”所以必须通过拼接比较而不是单纯字典序。面试延伸如果面试官追问可以补充说明为什么比较 s1s2 和 s2s1 就能保证正确性 这本质上是在模拟两个数字在最终结果中的相对位置确保局部最优能推导到全局最优。严格的数学证明需要用到排序的传递性。如果数字非常大怎么办 题目已经要求返回字符串Java 中 String 可以处理任意长度无需担心溢出。能不能用快排手写实现 可以但面试中直接用 Arrays.sort 更简洁重点在于自定义比较器的逻辑。时间复杂度中的 k 是什么 k 是数字的平均位数。如果所有数字都在 [0, 10⁹] 范围内k ≤ 10可以视为常数时间复杂度近似 O(n log n)。这道题的自定义排序思想在面试中非常经典和把数组排成最小的数剑指 Offer 45是同一道题的变形需要我顺带整理一下这类排序题的通用套路吗