每取一个数字尽量把小数字往左放,当遇到0时要在后面的卡片找不大于首位的卡片,
如果找到,就把0放到左边(标记该卡片的位置),否则放右边,
注意:第一个数字可能就为0.
#include<stdio.h> #include<string.h> char s[110],str[210]; int main() { int i,j,n,k,t,len; char *p,*q,ch,ph; scanf("%d",&t); while(t--) { scanf("%s",s); len=strlen(s); str[101]=s[0]; p=q=&str[101]; ch=p[0]; k=0;//比首位非0数字小的数字最靠后的位置 if(ch=='0')//如果第一个数为0,找非0的数字 { ph='9'; for(j=1;j<len;j++) if(s[j]<=ph&&s[j]!='0') {k=j;ph=s[j];} if(k==0)//如果没有,结果为0; {printf("0\n");continue;} } for(i=1;s[i];i++) { if(i==k)//遇到被被标记的数字必须放首位 { p--;p[0]=s[k]; ch=p[0]; k=0;continue; } if(s[i]!='0')//非0数字跟首位比较 { if(s[i]<=p[0])//如果小于首位,则更新首位 { p--;p[0]=s[i]; ch=p[0]; } else {q++;q[0]=s[i];}//加入末位 } else //找有没有比最靠前的非0数字小的数字 { ph=ch; for(j=i+1;j<len;j++) if(s[j]<=ph&&s[j]!='0') {k=j;ph=s[j];} if(k==0) {q++;q[0]=s[i];}//没有,0加入末位 else {p--;p[0]=s[i];}//找到就加入首位 } } q++;q[0]=0; printf("%s\n",p); } return 0; }