問題: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 --); } } }