输入一个整数n,把这个数的每一位的数拆开(个十百千位的数), 组合成
另一个数,另外组合的数算作一个集合{},找出比n小,但是集合{m}中最
大的一个数输出。
比如15234这个数, 可以拆成12345,然后组合的数要比15234小,但是
又是集合中最大的一个。
如果不存在,输出Not found
输入描述:
十进制整数n,长度小于100位
输出描述:
集合中最大数m。如果不存在,输出Not found。 注意大小写
示例1输入输出示例仅供调试,后台判题数据一 般不包含示例
输入
153
输出
135
示例2输入输出示例仅供调试,后台判题数据一 般不包含示例
输入
输出
Not found
/*功能:*/
#include<bits/stdc++.h>
using namespace std;
vector<int> previousPermuation(vector<int> &nums) {
// write your code here
if (nums.size() < 1) {
return {};
}
int i = 0;
// 从右向左遍历,找到第一个比当前值大的,然后从这个位置向后找比它小但是最接近的值,交换,
// 然后后面的数据要从大到小排列
for (i = nums.size() - 1; i >= 1; --i) {
if (nums[i] < nums[i - 1]) {
// 寻找从i位置开始向后比i-1位置小但是最接近的值
int flag = i;
int dis = nums[i - 1] - nums[i]; // > 0
for (int j = i; j < nums.size(); j++) {
if ((nums[i - 1] - nums[j] > 0) && (nums[i - 1] - nums[j] < dis)) {
dis = nums[i - 1] - nums[j];
flag = j;
}
}
// 交换
swap(nums[i-1], nums[flag]);
// i --> end(),降序排列
// 局部冒泡排序
for (int k = i; k < nums.size(); k++) {
for (int l = k + 1; l < nums.size(); l++) {
if (nums[k] < nums[l]) {
swap(nums[k], nums[l]);
}
}
}
break;
}
}
if (i == 0) {
reverse(nums.begin(), nums.end());
}
return nums;
}
int main()
{
string n;
cin>> n;
vector<int> vec;
for(auto ch : n){
vec.push_back(ch - '0');
}
vector<int> res = previousPermuation(vec);
string ans = "";
for(auto i : res){
ans += to_string(i);
}
if(n == ans || ans > n){
cout<<"Not found"<<endl;
return 0;
}
cout<< ans<< endl;
return 0;
}