func nextGreaterElement(n int) int { runes := []rune(strconv.Itoa(n)) for n = len(runes) - 2; 0 <= n && runes[n+1] <= runes[n]; n-- { } if n == -1 { return n } i := len(runes) - 1 for ; runes[i] <= runes[n]; i-- { } runes[n], runes[i] = runes[i], runes[n] for n, i = n+1, len(runes)-1; n < i; n, i = n+1, i-1 { runes[n], runes[i] = runes[i], runes[n] } n, _ = strconv.Atoi(string(runes)) if math.MaxInt32 < n { return -1 } return n }