1. Description
Given a positive integer n, find the next greater integer which has exactly the same digits existing in the integer n.
2. Solution
把数字n转换成字符串s,也就是找到s的全排列的当前排序的下一个排列。
在字符串s的末尾开始找,找到一个后一个元素(lowid+1)大于前一个元素的位置(lowid),
从lowid+1到字符串末尾,找到第一个小于或等于lowid的位置,记录它前面一个位置为highid。
highid位置上的数字大于lowid位置上的数字,将二者置换。再将lowid+1到字符串末尾的元素全部倒序。
这样就找到了s的全排列的当前排序的下一个排列。
如果s转换成数字超出了int范围,则返回-1;
否则返回s对应的int。
3. Code
int nextGreaterElement(int n) {
string s = to_string(n);
int lowid=-1,highid=-1;
for(int i=s.size()-1;i>=1;i--){
if(s[i]>s[i-1]){
lowid=i-1;;
break;
}
}
if(lowid==-1){
return -1;
}
int j=lowid+1;
for(;j<s.size();j++){
if(s[j]<=s[lowid]){
highid = j-1;
break;
}
}
if(j==s.size())
highid = s.size()-1;
swap(s[lowid],s[highid]);
for(int a = lowid+1,b=s.size()-1;a<b;a++,b--){
swap(s[a],s[b]);
}
//return highid;
if(s.size()==to_string(INT_MAX).size() && s>to_string(INT_MAX))
return -1;
else
return atoi(s.c_str());
}