556. 下一个更大元素 III
Posted hh09cnblogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
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;
以上是关于556. 下一个更大元素 III的主要内容,如果未能解决你的问题,请参考以下文章