题目描述 :输入含有数字与字母并且以',' ';' 分开让你分开两行输出子串数字和字母(顺序不变,前导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; }