题目描述 :输入含有数字与字母并且以',' ';' 分开让你分开两行输出子串数字和字母(顺序不变,前导0不算数字(除0外),数字加字母算字母)
1 ≤ |s| ≤ 10^5
分析:显然是个模拟题,但数据太大数组不好开而且操作也不方便,所以开vector<vector<int> > 比较好些,前导0算作一个特判处理
ac代码:
#include<bits/stdc++.h>
#define pb(x) push_back(x)
#define sz(x) size(x)
#define ey(x) empty(x)
#define pp() pop(x)
#define cr(x) clear(x)
#define p(x) push(x)
#define t(x) top(x)
#define f(x) front(x)
#define FOR(i,j,n) for(int i=j;i<n;i++)
#define WE(t) while(t--)
#define mp(x,y) make_pair(x,y)
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;
vector<vector<char> > vec[2];
int main(){
// freopen("1.txt","r",stdin);
ios::sync_with_stdio(0);
cin.tie(0);
string s;
cin>>s;
int sz=s.length();
vector<char> temp;
int flag=1,i=0;
while(i<sz){
if(s[i]!=','&&s[i]!=';'){
temp.pb(s[i]);
if(!isdigit(s[i])||temp.sz()==1&&s[i]=='0') flag=1;
else if(temp.sz()==1&&isdigit(s[i])) flag=0;
}
else {
if(flag==1&&(temp.sz()!=1||temp[0]!='0')) vec[1].pb(temp),flag=1;
else vec[0].pb(temp),flag=1;
temp.cr();
}
i++;
}
if(temp.sz()==1&&temp[0]=='0') vec[0].pb(temp);
else {
if(flag==1) vec[1].pb(temp);
else vec[0].pb(temp);
}
if(!vec[0].ey()) {cout<<'\"';
for(int i=0,sz=vec[0].sz();i<sz;i++){
for(int j=0,sz1=vec[0][i].sz();j<sz1;j++)
cout<<vec[0][i][j];
if(i!=sz-1) cout<<',';
}cout<<'\"';
}
else cout<<'-';
cout<<endl;
if(!vec[1].ey()){cout<<'\"';
for(int i=0,sz=vec[1].sz();i<sz;i++){
for(int j=0,sz1=vec[1][i].sz();j<sz1;j++)
cout<<vec[1][i][j];
if(i!=sz-1) cout<<',';
}cout<<'\"';
}
else cout<<'-'<<endl;
}

京公网安备 11010502036488号