题意:给一个长度不超过100000的奇数,要求交换任意两位上的数字,使它成为一个最大的偶数。
思路:字符串读入,记录下最后一位数上的奇数a,从前往后扫,找到第一个比a小的偶数,将它和a交换就是结果,若没有找到比a小的偶数,就将a和最后一个偶数交换。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 100005
#define MAXN 2005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
typedef long long ll;
using namespace std;
char str[maxn];
int main()
{
char ch;
while (~scanf("%s",str))
{
int len=strlen(str);
int heven=0; //标记是否有偶数
int minn=INF;
int pos; //记录第一个比最末尾奇数小的偶数的位置
int first=1;
int posmo; //记录最靠后的偶数的位置
int last=str[len-1]-'0';
for (int i=0;i<len;i++)
{
int a=str[i]-'0';
if (a%2==0)
{
posmo=i;
heven=1;
if (first&&a<last)
{
pos=i;
first=0;
break;
}
}
}
if (heven==0)
printf("-1\n");
else
{
if (!first)
{
ch=str[len-1];
str[len-1]=str[pos];
str[pos]=ch;
}
else
{
ch=str[len-1];
str[len-1]=str[posmo];
str[posmo]=ch;
}
printf("%s\n",str);
}
}
return 0;
}