556. 下一个更大元素 III
556. 下一个更大元素 III
给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n。如果不存在这样的32位整数,则返回-1。
- 示例 1:
输入: 12
输出: 21 - 示例 2:
输入: 21
输出: -1
代码
class Solution {
public int nextGreaterElement(int n) {
int[] array = transfer(n);
/*
求出的下一个全排列可能会超出int类型的范围
这并不符合得出的答案是32位的结果
所以我将结果用long保存
如果它超出了int的表示范围
就返回-1
*/
long result = nextArray(array);
if (result > Integer.MAX_VALUE) {
return -1;
}
return (int)result;
//return nextArray(array);
}
public long nextArray(int[] array) {
int length = array.length;
/*
* 第一步,寻找最后一个正序
* 寻找方法 : 从后向前找
*/
int i;
for (i = length-1; i > 0 ; i--) {
if (array[i-1] < array[i]) {
break;
}
}
/*
* 如果没找到,也就是到了最后的一个
*/
if (i == 0) {
return -1;
}
/*
*第二步,从后往前找一个比array[i-1]大的第一个数字.
*/
int j;
for (j = length-1; j > i; j --) {
if (array[j] > array[i-1]) {
break;
}
}
/*
第三步,交换array[i-1],array[j]
*/
int temp = array[i-1];
array[i-1] = array[j];
array[j] = temp;
/*
最后一步,把i-1后面(从i-2开始至length-1)的序列反序
*/
while (i < length-1) {
temp = array[i];
array[i] = array[length-1];
array[length-1] = temp;
i ++;
length --;
}
/*
反序完毕即为一次排列结束
得到的序列就是下一个全排列
*/
long result = 0;
for (int index = 0; index < array.length; index++) {
result *= 10;
result += array[index];
}
return result;
}
private int[] transfer(int n) {
String str = Integer.toString(n);
int[] arr = new int[str.length()];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(String.valueOf(str.charAt(i)));
}
return arr;
}
}