当前位置: 面试刷题>> 将数组重新排列以构建最小值 (经典算法题500道)


### 题目描述补充 题目:**将数组重新排列以构建最小值** 给定一个包含正整数和负整数的数组,你需要重新排列这些数字(可以改变它们的相对顺序),使得重新排列后的数组按照从左到右的顺序读取时,能够得到一个尽可能小的数。例如,数组 `[3, 30, 34, 5, 9]` 可以被重新排列为 `[3, 3, 5, 9, 34]`,这样形成的数 `335934` 是最小的。 注意,返回的结果应当是一个数字字符串形成的表示,而不是数字本身,因为结果可能非常大,超出了标准整数类型的表示范围。 ### 示例 输入:`[3, 30, 34, 5, 9]` 输出:`"335934"` 输入:`[-10, -5, 0, 0, 5]` 输出:`"-10-50005"` ### PHP 代码示例 ```php function minNumber($nums) { // 自定义排序函数,先按数字绝对值升序排序,若绝对值相同则按原数字降序排序 usort($nums, function($a, $b) { if (abs($a) == abs($b)) { return $b - $a; } return abs($a) - abs($b); }); // 将排序后的数组转换为字符串 $result = implode('', $nums); return $result; } // 测试 echo minNumber([3, 30, 34, 5, 9]); // 输出 335934 echo minNumber([-10, -5, 0, 0, 5]); // 输出 -10-50005 ``` ### Python 代码示例 ```python def minNumber(nums): # 使用自定义排序函数 nums.sort(key=lambda x: (-x if x < 0 else x, str(x))) # 将排序后的列表转换为字符串 return ''.join(map(str, nums)) # 测试 print(minNumber([3, 30, 34, 5, 9])) # 输出 335934 print(minNumber([-10, -5, 0, 0, 5])) # 输出 -10-50005 ``` ### JavaScript 代码示例 ```javascript function minNumber(nums) { // 使用自定义排序函数 nums.sort((a, b) => { if (Math.abs(a) === Math.abs(b)) { return b - a; } return Math.abs(a) - Math.abs(b); }); // 将排序后的数组转换为字符串 return nums.join(''); } // 测试 console.log(minNumber([3, 30, 34, 5, 9])); // 输出 335934 console.log(minNumber([-10, -5, 0, 0, 5])); // 输出 -10-50005 ``` **码小课** 网站中有更多关于排序算法、字符串处理及数组操作的相关内容分享,欢迎大家学习交流。
推荐面试题