展开字符串 字符模拟
这次测试,上来我就啃了这这个题,谁知半小时了,脑子还是一头雾水,别人已经刷了4道啦,没办法,只好先放一放。其他的做完菜回过头重新做。字符串里面,我一直不擅长字符指针,刚开始用字符指针去做,但是很吃力,因为要考虑结束符的问题。再看查题,里面的括号真是个问题,加上这次老师说是考递归,我想里面的括号难道是用递归脱去,但想想这样也太麻烦了吧。没办法,只好用那一招啦---查资料,人家说时先脱括号,从后面向前脱。感觉说的有道理,脱去的只要连起来就行啦,哎...有好几个童靴都提交啦,里面的数组需要小心,容易出错,我也是参考人家的格式,感觉还要多加练习才行啊.
no Code - -||
#include<stdio.h> #include<string.h> char str[500001]; char ans[500001]; char help[50001]; int n,len; void fan2(int sum,char help[],char ans[],int k) { int p,q; for(p=1;p<=sum;p++) { for(q=0;help[q]!=0;q++) { str[k++]=help[q]; } } for(q=0;ans[q]!=0;q++) { str[k++]=ans[q]; } len=k; } void fan() { int i,j; int p,q,k; int sum; for(i=n-1;i>=0;i--) { if(str[i]=='(') { for(j=i+1;;j++) { if(str[j]==')') { help[j-i-1]=0; break; } help[j-i-1]=str[j]; } sum=0; p=1; while(i-1>=0&&str[i-1]>='0'&&str[i-1]<='9') { sum=(str[i-1]-'0')*p+sum; p=p*10; i--; } if(sum==0) sum=1; for(q=j+1;q<len;q++) { ans[q-j-1]=str[q]; } ans[q-j-1]=0; k=i; fan2(sum,help,ans,k); } else if(str[i]>='0'&&str[i]<='9') { sum=0; p=1; j=i+1; while(i>=0&&str[i]>='0'&&str[i]<='9') { sum=(str[i]-'0')*p+sum; p=p*10; i--; } i++; if(sum==0) sum=1; if(j<n) { help[0]=str[j]; help[1]=0; for(p=j+1;p<len;p++) { ans[p-j-1]=str[p]; } ans[p-j-1]=0; fan2(sum,help,ans,i); } } } str[len]=0; } int main() { int k; scanf("%d",&k); while(k--) { scanf("%s",str); n=strlen(str); len=n; fan(); printf("%s\n",str); } return 0; }