原题链接:传送门
题意:给你一个字符串,这个字符串是一个只包含字符’ 0 ‘,’ 1 ‘和’ 2 ’ 的字符串。你可以交换任意两个相邻的字符如’0’和’1’、’1’和’2’,而’0’和’2’则不能交换。你需要通过交换任意次数来获得最小可能(按字典排序)的字符串。并将这个字符串打印出来。
由于’1’类似一个中介的字符——可以与’0’、’2’交换,这里我们可以先找出第一个’2’的位置,将’2’之前的’0’放在最前面,再把所有的’1’都放在第一个’2’前面,然后再判断第一个’2’后面的所以字符。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
string str;
cin>>str;
int len = str.length();
int num0 = 0, num1 = 0, flag = 0 ,pos = len; //pos记录第一个'2'的位置,将其初始化为字符长度后一位
for(int i=0;i<len;i++){
if(str[i] == '0' && flag == 0){ //找第一个'2'之前的'0'的个数
num0 ++;
}
else if(str[i] == '1'){ //'1'的全部数目
num1 ++;
}
else if(str[i] == '2' && flag == 0){ //找到第一个'2'将其标记
flag = 1;
pos = i;
}
}
for(int i=0;i<num0;i++)
printf("0");
for(int i=0;i<num1;i++)
printf("1");
while(pos < len){ //第一个'2'之后的
if(str[pos] != '1')
printf("%c",str[pos]);
pos ++;
}
return 0;
}