179.最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

输入:nums = [10,2]
输出:"210"

示例 2:

输入:nums = [3,30,34,5,9]
输出:"9534330"

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 109

解题思路:

  • 这本质是一个排序问题,关键在于定义正确的比较规则
  • 对于两个数字 a 和 b,我们需要比较 "ab" 和 "ba" 的大小:
  • 如果 "ab" > "ba",则 a 应该排在 b 前面
  • 如果 "ab" < "ba",则 b 应该排在 a 前面
  • 使用自定义排序规则对数组进行排序
  • 特殊处理:如果排序后第一个数字是0,则结果就是"0"
func largestNumber(nums []int) string {
    if len(nums) == 0 {
        return ""
    }
    
    var strNums = make([]string, len(nums))
    for i, num := range nums {
        strNums[i] = strconv.Itoa(num)
    }
    
    // 自定义排序
    sort.Slice(strNums, func(i, j int) bool {
        return strNums[i]+strNums[j] > strNums[j] + strNums[i]
    })
    
    // 特殊情况
    if strNums[0] == "0" {
        return "0"
    }
    
    return strings.Join(strNums, "")
}