题目:
给定一组非负整数 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]排序会得到01和11,而不是01和10
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)
}