链接
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 :
代码语言:shell复制输入: 2736
输出: 7236
解释: 交换数字2和数字7。
代码语言:shell复制输入: 9973
输出: 9973
解释: 不需要交换。
代码语言:shell复制/*
从0开始,找到后续最大的那个数x,并且x的下标要最大
举例:13333,相对1而言,x=3,并且下标最大的3是个位的3,彼此交换,33331
只要记录0-9最后出现的位数{-1, 0, -1, 4, -1, -1, -1, -1, -1, -1}
*/
func maximumSwap(num int) int {
nums := []int{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
numstr := []byte(strconv.Itoa(num))
for i, v := range numstr {
nums[v-'0'] = i
}
outter:
for i := 0; i < len(numstr); i {
tmp := int(numstr[i] - '0')
//从9开始由大到小找
for j := 9; j > tmp; j-- {
//目标的下标大于现在下标
if nums[j] > i {
numstr[i], numstr[nums[j]] = numstr[nums[j]], numstr[i]
break outter
}
}
}
ret, _ := strconv.Atoi(string(numstr))
return ret
}