
本文讲解如何将整数数组重新排列,使其连接后形成最大的数字,重点解决因整数溢出导致的 NumberFormatException,并提供高效、健壮的字符串比较排序方案。
本文讲解如何将整数数组重新排列,使其连接后形成最大的数字,重点解决因整数溢出导致的 `numberformatexception`,并提供高效、健壮的字符串比较排序方案。
在解决“拼接数组元素得到最大数值”问题时,直接按数值大小排序是错误的——例如 [111311, 1113] 中,111311 > 1113,但 "111311"+"1113" = "1113111113" 小于 "1113"+"111311" = "1113111311"。真正决定顺序的是两两拼接后的字典序大小:若 a+b > b+a(字符串比较),则 a 应排在 b 前面。
原始代码使用 Integer.parseInt(a) 将拼接字符串转为整数,但当数组元素较大(如 111311 和 1113)时,拼接结果 "111311111311" 远超 int 范围(约 21 亿),触发 NumberFormatException。根本解法是全程避免数值转换,仅用字符串比较:
if (s1.compareTo(s2) 表示当 nums[i] 与 nums[j] 拼接后不如 nums[j] 在前时,交换二者位置,确保最终数组满足“高位优先取更大组合”的贪心策略。
- 完全规避整数溢出风险;
- 利用字符串自然字典序比较,逻辑清晰;
-
Arrays.sort使用双轴快排,性能远优于 O(n²) 冒泡; - 包含
"0"边界检查,防止nums = [0,0]输出"00"。
调用示例:
int[] arr = {111311, 1113};
System.out.println(largestNumber(arr)); // 输出:"1113111311"
int[] arr2 = {54, 546, 548, 60};
System.out.println(largestNumber(arr2)); // 输出:"6054854654"
总结:该问题本质是自定义排序问题,核心在于重定义元素间的大小关系——不是数值大小,而是拼接后的字符串字典序。坚持字符串操作、善用标准排序 API,并处理全零等边界情况,即可写出鲁棒、高效、可维护的解决方案。










