179.最大数

200 阅读1分钟

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

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

func largestNumber(nums []int) string {
    mergeSort(nums, 0, len(nums) - 1)
    ans := ""
    fmt.Println(nums)
    for i := range nums {
		if ans == "0" && nums[i] == 0 {
			continue
		}
        ans = fmt.Sprintf("%s%d",ans,nums[i])
    }
    return ans
}

func mergeSort(nums []int, left, right int) {
    if left == right {
        return
    }
    mid := (left + right) / 2
    mergeSort(nums, left, mid)
    mergeSort(nums, mid + 1, right)
    tmp := make([]int, 0)
    leftStart, rightStart := left, mid + 1
    for leftStart <= mid && rightStart <= right {
        if less(nums[leftStart], nums[rightStart]) {
            tmp = append(tmp, nums[leftStart])
            leftStart ++
        } else {
            tmp = append(tmp, nums[rightStart])
            rightStart ++
        }
    }
    for leftStart <= mid {
            tmp = append(tmp, nums[leftStart])
            leftStart ++
    }
    for rightStart <= right {
            tmp = append(tmp, nums[rightStart])
            rightStart ++
    }
    for i := 0; i < len(tmp); i ++ {
        nums[left + i] = tmp[i]
    }
}

func less(a, b int) bool {
    // 注意这个边界条件,有0得情况下不能走下面的逻辑。
    // 因为[0,1]排序会得到0111,而不是0110
    if a == 0 || b == 0 {
        return a > b
    }
    aWeight, bWeight := 1, 1
    copyA, copyB := a, b
    for copyA > 0 {
        aWeight = aWeight * 10
        copyA = copyA / 10
    }
    for copyB > 0 {
        bWeight = bWeight * 10
        copyB = copyB / 10
    }
    // fmt.Println(a, aWeight, b, bWeight)
    return (a * bWeight + b) > (b * aWeight + a)
}