当前位置: 面试刷题>> 将数组重新排列以构建最小值 (经典算法题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
```
**码小课** 网站中有更多关于排序算法、字符串处理及数组操作的相关内容分享,欢迎大家学习交流。