当前位置: 面试刷题>> 最大数 (经典算法题500道)
### 完整题目描述
**题目**:最大数
**描述**:
给定一个非负整数数组,你需要重新排列数组中的数字,使得按照从左到右的顺序读,该数字尽可能大。例如,给定数组 `[12, 34, 5, 6, 7]`,通过重新排列,可以得到最大数为 `76543212`。注意,由于数字可能很大,所以结果应该以字符串的形式返回。
**要求**:
1. 不能使用额外的数组来存储结果(除了用于返回的字符串)。
2. 原地修改数组并转化为字符串返回不是必要的,但如果你能做到,也是一种解决方案。
3. 考虑到整数溢出的问题,建议使用字符串来进行比较和拼接。
### 示例代码
#### PHP 示例
```php
function largestNumber($nums) {
// 使用自定义的比较函数对数组进行排序
usort($nums, function($a, $b) {
// 字符串比较,将数字转为字符串,并在每个数字后添加一个随机较小字符(这里用0)来确保较长的数字排在前面
$str1 = $a . '0';
$str2 = $b . '0';
if ($str1 == $str2) {
return 0;
}
return ($str1 > $str2) ? -1 : 1;
});
// 排除数组首位为0的情况
if ($nums[0] == 0) {
return '0';
}
// 将数组转换为字符串并返回
return implode('', $nums);
}
// 示例用法
$nums = [12, 34, 5, 6, 7];
echo largestNumber($nums); // 输出 76543212
```
#### Python 示例
```python
def largestNumber(nums):
# 使用自定义的排序key,将数字转为字符串后进行比较
nums_sorted = sorted(nums, key=str, reverse=True)
# 排除首位为0的情况
if nums_sorted[0] == 0:
return '0'
# 将列表转换为字符串并返回
return ''.join(map(str, nums_sorted))
# 示例用法
nums = [12, 34, 5, 6, 7]
print(largestNumber(nums)) # 输出 76543212
```
#### JavaScript 示例
```javascript
function largestNumber(nums) {
// 使用数组的sort方法和自定义比较函数
nums.sort((a, b) => {
// 字符串比较,注意JavaScript中字符串比较已足够处理这个问题
return (b + '').localeCompare(a + '', undefined, { numeric: true });
});
// 排除首位为0的情况
if (nums[0] === 0) {
return '0';
}
// 将数组转换为字符串并返回
return nums.join('');
}
// 示例用法
const nums = [12, 34, 5, 6, 7];
console.log(largestNumber(nums)); // 输出 76543212
```
**码小课**:在解决这类问题时,理解题目要求和限制条件非常重要。同时,掌握不同编程语言中数组排序和字符串处理的函数和方法也是关键。码小课网站中有更多关于算法和数据结构的内容,可以帮助大家深入学习并提升编程能力。