GuilinDev

Lc0556

05 August 2008

556 Next Greater Element III

给你一个正整数 n ,找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1 。

注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1 。

Example 1:

1
2
Input: n = 12
Output: 21

Example 2:

1
2
Input: n = 21
Output: -1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
    /*
    底下yuxiangmusic的评论:https://leetcode.com/problems/next-greater-element-iii/discuss/101824/Simple-Java-solution-(4ms)-with-explanation.
    */
    public int nextGreaterElement(int n) {
        char[] arr = String.valueOf(n).toCharArray();
        int i = arr.length - 2;
        
        while (i >= 0 && arr[i] >= arr[i+1]) {
            i--;
        }
        
        if (i < 0) {
            return -1;
        }
        int j = arr.length - 1;
        while (arr[j] <= arr[i]) {
            j--;
        }
        swap(arr, i, j);
        reverse(arr, i + 1, arr.length - 1);
        
        try {
            return Integer.valueOf(String.valueOf(arr));
        } catch(NumberFormatException e) {
            return -1;
        }
    }
    private void swap(char[] arr, int i, int j) {//这种换位法
        arr[i] ^= arr[j];
        arr[j] ^= arr[i];
        arr[i] ^= arr[j];
    }

    private void reverse(char[] arr, int i, int j) {
        int l = i, h = j;
        while (l < h) {
            swap(arr, l++, h--);
        }
    }
}

官方解法