https://ac.nowcoder.com/acm/contest/20104/B
思路
模拟即可,先枚举全是数字,没有符号的情况。再循环枚举加减号,枚举完再倒退再枚举一遍乘除号。枚举的同时sum++存储时间戳,a[i]=sum。最后再循环输出。(感觉自己的方法好复杂。。。)
code
#include<bits/stdc++.h>//万能头
using namespace std;
const int MAXN=1000005;//宏定义
char s[MAXN];//原字符串s
int a[MAXN];//存储时间戳的a数组
int n,sum=1;//时间戳sum从1开始
bool bj,flg;//俩标记
int main()
{
scanf("%d",&n);//输入n
scanf("%s",s+1);//输入s
for(int i=1;i<=n;i++)
{
if(s[i]=='+'||s[i]=='-'||s[i]=='/'||s[i]=='*')
{
bj=true;
break;
}
}//枚举有没有运算符号
if(bj==false)//没有直接输出
{
printf("%s",s+1);
return 0;
}
for(int i=1;i<=n;i++)//枚举
{
if(flg==true&&(s[i]=='+'||s[i]=='-'))//先枚一遍+-
{
a[i]=sum;//存时间戳
sum++;//时间戳++
}//这里flag=true代表是第一遍枚举
if(flg==false&&(s[i]=='/'||s[i]=='*'))//再枚一遍/*
{
a[i]=sum;
sum++;//同理
}//flag==false是重来的那一遍
if(i==n&&flg==false)//如果加减枚完了
{
i=1;//再枚一遍
flg=true;//标记打上
}
}
for(int i=1;i<=n;i++)//循环输出
{
if(s[i]!='+'&&s[i]!='-'&&s[i]!='/'&&s[i]!='*')//不是运算符号
{
printf("%c",s[i]);//直接输出
continue;
}
printf("%c[%d]",s[i],a[i]);//打上时间戳输出
}
return 0;//结束
}