556.next-greater-element-iii.go 455 B

1234567891011121314151617181920
  1. func nextGreaterElement(n int) int {
  2. runes := []rune(strconv.Itoa(n))
  3. for n = len(runes) - 2; 0 <= n && runes[n+1] <= runes[n]; n-- {
  4. }
  5. if n == -1 {
  6. return n
  7. }
  8. i := len(runes) - 1
  9. for ; runes[i] <= runes[n]; i-- {
  10. }
  11. runes[n], runes[i] = runes[i], runes[n]
  12. for n, i = n+1, len(runes)-1; n < i; n, i = n+1, i-1 {
  13. runes[n], runes[i] = runes[i], runes[n]
  14. }
  15. n, _ = strconv.Atoi(string(runes))
  16. if math.MaxInt32 < n {
  17. return -1
  18. }
  19. return n
  20. }