05 August 2008
给你一个正整数 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--);
}
}
}