题目链接
题目大意,给出一串由 0 1 2组成的字符串,0和1 1和2 能彼此交换位置,求输出最小的字符串
思路:
比赛的时候,一心想着用冒泡排序做这个题目,直接没观察数据量,总是卡着一个点,之前做过一个题目,冒泡排序的时候,可以改变一下交换条件,尤其是这种相邻位置交换的,
这个题的话,就是,因为1可以到任何地方去,所以,先计算出所有的1,然后计算第一个2出现的位置的前面有多少个0,然后把1全部放在0 2的中间,后面的,把1去掉输出就行了
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define maxn 100005
using namespace std;
char s[maxn],ans[maxn];
int main()
{
cin>>s;
int n=strlen(s);
int num0=0,num1=0;
s[n]='2';
for(int i=0; i<n; i++)
if(s[i]=='1')
num1++;
int i=0;
while(s[i]!='2')
{
if(s[i]=='0')
num0++;
i++;
}
int k=0;
for(k=0; k<num0; k++)
ans[k]='0';
for(k=num0; k<num0+num1; k++)
ans[k]='1';
for(i=i; i<n; i++)
{
if(s[i]!='1')
ans[k++]=s[i];
}
ans[n]=0;
cout<<ans<<endl;
return 0;
}