func maximumSwap(num int) int {
	digit := make([]int, 0)
	for i := num; 0 < i; i /= 10 {
		digit = append(digit, i%10)
	}
	n := len(digit)
	max := make([]int, n)
	for i := 1; i < n; i++ {
		max[i] = i // max[i]: the maximum digit that lower than the ith digit
		if digit[i] <= digit[max[i-1]] {
			max[i] = max[i-1]
		}
	}
	for i := n - 1; 0 <= i; i-- {
		if digit[i] < digit[max[i]] {
			digit[i], digit[max[i]] = digit[max[i]], digit[i]
			res := 0
			for j := n - 1; 0 <= j; j-- {
				res *= 10
				res += digit[j]
			}
			return res
		}
	}
	return num
}