问题:git
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.spa
Example 1:.net
Input: 12 Output: 21
Example 2:blog
Input: 21 Output: -1
解决:get
【题意】给定一个正的32位整数n,你须要找到最小的32位整数,其整数n中的数字彻底相同,而且数值大于n。 若是不存在这样的正32位整数,则须要返回-1。it
① 本题实质上能够转换为求当前全排列的下一个排列(Next Permutation)。因此,从后向前扫描,找到第一个降序的位置,而后找到右侧第一个大于该位置的值的数,交换这两个数,而后反转该位置以后的数,就能够获得想要的结果。若是总体都是升序的,就返回-1.io
1 2 7 4 3 1 ----- 找到第一个降序的位置class
1 2 7 4 3 1 ----- 找到其右侧开始找第一个大于它的值next
1 3 7 4 2 1 ----- 交换这两个值di
1 3 1 2 4 7 ----- 由于开头变了,反转以后的排列
class Solution {//4ms
public int nextGreaterElement(int n) {
String str = String.valueOf(n);
char[] schar = str.toCharArray();
int len = schar.length;
int i;
for (i = len - 1;i > 0;i --){
if (schar[i] > schar[i - 1]) break;
}
if (i == 0) return -1;
for (int j = len - 1;j >= i;j --){
if (schar[j] > schar[i - 1]){
swap(schar,i - 1,j);
break;
}
}
reverse(schar,i,schar.length - 1);
long res = Long.parseLong(String.valueOf(schar));//防止转换后的结果越界 return res > Integer.MAX_VALUE ? -1 : (int)res; } public void swap(char[] schar,int i,int j){ char tmp = schar[i]; schar[i] = schar[j]; schar[j] = tmp; } public void reverse(char[] schar,int i,int j){ while (i < j){ swap(schar,i ++,j --); } } }