题目:
给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n ****中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1 。
注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1 。
解法:
解法31. 下一个排列的官方题解相同
import "math"
func nextGreaterElement(n int) int {
cnt := 0
num := n
array := make([]int, 0)
for num != 0 {
cnt ++
array = append(array, num % 10)
num = num / 10
}
if n < 2 {
return -1
}
ans := 0
i := 1
for ; i < cnt; i ++ {
if array[i - 1] > array[i] {
break
}
}
// fmt.Println(array)
minimalInMax := i - 1
// i != cnt意味着 n从右往左按位查找,找到了降序的点
if i != cnt {
// 遍历的方向要注意,否则最高位的2和此高位的3交换,23332得到32233是错误结果。
// minimalInMax大的值里面最小的,
for j := i -1; j >= 0; j -- {
if array[j] > array[i] && array[j] <= array[minimalInMax] {
minimalInMax = j
}
}
array[i], array[minimalInMax] = array[minimalInMax], array[i]
for left, right := 0, i - 1; left < right; left, right = left + 1, right - 1 {
array[left], array[right] = array[right], array[left]
}
// 没找到
} else {
return -1
}
// fmt.Println(array)
// 将array组合成数字
carry := 1
for i := range array {
ans = ans + carry * array[i]
carry = carry * 10
}
if ans > math.MaxInt32 {
return -1
}
return ans
}