📑 题目:179. 最大数

🚀 本题 LeetCode 传送门

题目大意

给出一个数组,要求排列这些数组里的元素,使得最终排列出来的数字是最大的。

解题思路

这一题很容易想到把数字都转化为字符串,利用字符串比较,来排序,这样 9 开头的一定排在最前面。不过这样做有一个地方是错误的,比如:“3” 和 “30” 比较,“30” 比 “3” 的字符序要大,这样排序以后就出错了。实际上就这道题而言, “3” 应该排在 “30” 前面。

在比较 2 个字符串大小的时候,不单纯的只用字符串顺序进行比较,还加入一个顺序。

  1. aStr := a + b
  2. bStr := b + a

通过比较 aStr 和 bStr 的大小来得出是 a 大还是 b 大。

举个例子,还是 “3” 和 “30” 的例子,比较这 2 个字符串的大小。

  1. aStr := ""3"" + ""30"" = ""330""
  2. bStr := ""30"" + ""3"" = ""303""

通过互相补齐位数之后再进行比较,就没有问题了。很显然这里 “3” 比 “30” 要大。

代码

  1. package leetcode
  2. import (
  3. ""strconv""
  4. )
  5. func largestNumber(nums []int) string {
  6. if len(nums) == 0 {
  7. return """"
  8. }
  9. numStrs := toStringArray(nums)
  10. quickSortString(numStrs, 0, len(numStrs)-1)
  11. res := """"
  12. for _, str := range numStrs {
  13. if res == ""0"" && str == ""0"" {
  14. continue
  15. }
  16. res = res + str
  17. }
  18. return res
  19. }
  20. func toStringArray(nums []int) []string {
  21. strs := make([]string, 0)
  22. for _, num := range nums {
  23. strs = append(strs, strconv.Itoa(num))
  24. }
  25. return strs
  26. }
  27. func partitionString(a []string, lo, hi int) int {
  28. pivot := a[hi]
  29. i := lo - 1
  30. for j := lo; j < hi; j++ {
  31. ajStr := a[j] + pivot
  32. pivotStr := pivot + a[j]
  33. if ajStr > pivotStr { // 这里的判断条件是关键
  34. i++
  35. a[j], a[i] = a[i], a[j]
  36. }
  37. }
  38. a[i+1], a[hi] = a[hi], a[i+1]
  39. return i + 1
  40. }
  41. func quickSortString(a []string, lo, hi int) {
  42. if lo >= hi {
  43. return
  44. }
  45. p := partitionString(a, lo, hi)
  46. quickSortString(a, lo, p-1)
  47. quickSortString(a, p+1, hi)
  48. }