-
Notifications
You must be signed in to change notification settings - Fork 81
/
NextGreaterElementIII556.java
90 lines (81 loc) 路 2.18 KB
/
NextGreaterElementIII556.java
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
* Given a positive 32-bit integer n, you need to find the smallest 32-bit
* integer which has exactly the same digits existing in the integer n and is
* greater in value than n. If no such positive 32-bit integer exists, you need
* to return -1.
*
* Example 1:
* Input: 12
* Output: 21
*
* Example 2:
* Input: 21
* Output: -1
*/
public class NextGreaterElementIII556 {
public int nextGreaterElement(int n) {
int len = String.valueOf(n).length();
int[] digits = new int[len];
int p = n;
int i = len-1;
int pre = p % 10;
int mark = -1;
while (p != 0) {
int now = p % 10;
digits[i] = now;
if (mark == -1 && now < pre) {
int j = i+1;
while (j < len && digits[j] > now) j++;
swap(digits, i, j-1);
mark = i;
}
pre = now;
p = p / 10;
i--;
}
if (mark == -1) return -1;
Arrays.sort(digits, mark+1, len);
long res = 0;
long tens = 1;
for (int j=len-1; j>=0; j--) {
res += digits[j] * tens;
tens = tens * 10;
}
return res > Integer.MAX_VALUE ? -1 : (int) res;
}
private void swap(int[] digits, int i, int j) {
int temp = digits[i];
digits[i] = digits[j];
digits[j] = temp;
}
public int nextGreaterElement2(int n) {
int[] digits = new int[10];
int k = n;
int i = 9;
while (k != 0) {
digits[i--] = k % 10;
k /= 10;
}
if (i == 8) return -1;
int j = 8;
while (j > i) {
if (digits[j] < digits[j+1]) break;
j--;
}
if (j == i) return -1;
int p = 9;
while (p > j) {
if (digits[p] > digits[j]) break;
p--;
}
swap(digits, j, p);
Arrays.sort(digits, j+1, 10);
long res = 0;
long level = 1;
for (int q=9; q>=0; q--) {
res += digits[q] * level;
level *= 10;
}
return res > Integer.MAX_VALUE ? -1 : (int) res;
}
}