179. 最大数

179. 最大数

179. 最大数

难度中等

给定一组非负整数 nums,重新排列它们每位数字的顺序使之组成一个最大的整数。

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

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [1]
输出:"1"

示例 4:

输入:nums = [10]
输出:"10"

提示:

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

分析

整体思路就是排序,但是要确定好排序的标准。

思路很简单,细节是魔鬼~

尝试1:
将所有int转化成string,然后降序排序,再一一将这些string链接起来
问题:比如输入3,30那么预期应该是330而不是303

尝试2:
多考虑一下,其实排序的依据是这样:
对于两个string, a和b 如果a+b > b+a, 那么应该把a排在前边~
问题:
输入一堆0, 预期输出0,而不是一堆0

最终,踩完这些坑后,终于成了~
时间复杂度O(nlgn),空间复杂度O(n)
func largestNumber(nums []int) string {
	strs := make([]string, len(nums))
	for i, v := range nums {
		strs[i] = strconv.Itoa(v)
	}
	sort.Slice(strs, func(i, j int) bool {
		return strs[i]+strs[j] > strs[j]+strs[i]
	})
	result := strings.Join(strs, "")
	if result[0] == '0' { // 一堆0的输入有这个结果
		return "0"
	}
	return result
}