# 最大数

![last modify](https://img.shields.io/static/v1?label=last%20modify\&message=2022-10-14%2014%3A59%3A33\&color=yellowgreen\&style=flat-square) [![](https://img.shields.io/static/v1?label=\&message=%E4%B8%AD%E7%AD%89\&color=yellow\&style=flat-square)](https://imhuay.gitbook.io/studies/algorithms/..#中等) [![](https://img.shields.io/static/v1?label=\&message=%E7%89%9B%E5%AE%A2\&color=green\&style=flat-square)](https://imhuay.gitbook.io/studies/algorithms/..#牛客) [![](https://img.shields.io/static/v1?label=\&message=%E6%8E%92%E5%BA%8F\&color=blue\&style=flat-square)](https://imhuay.gitbook.io/studies/algorithms/..#排序)

> [最大数\_牛客题霸\_牛客网](https://www.nowcoder.com/practice/fc897457408f4bbe9d3f87588f497729)

**问题简述**

```
给定一个长度为n的数组nums，数组由一些非负整数组成，现需要将他们进行排列并拼接，每个数不可拆分，使得最后的结果最大，返回值需要是string类型，否则可能会溢出。
```

**思路**

* 自定义排序，当 `int(str(b) + str(a)) > int(str(a) + str(b))` 时，就交换 `a` 和 `b`；
  * 非 Python 可能存在越界风险；
* 细节：存在前导 0 的情况；

<details>

<summary><strong>Python</strong></summary>

```python
class Solution:
    def solve(self , nums: List[int]) -> str:
        
        from functools import cmp_to_key
        
        def cmp(a, b):
            # return int(str(b) + str(a)) - int(str(a) + str(b))  # 可能越界
            return 1 if str(b) + str(a) > str(a) + str(b) else -1  # else 0  会出错
        
        nums = sorted(nums, key=cmp_to_key(cmp))
        if nums[0] == 0:
            return '0'
        return ''.join(map(str, nums))
```

</details>
