寻找最大数(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
-
给你一个数字n(可能有前缀0)。
要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大。
- 输入
- 有多组测试数据。
对于每组数据,输入一个n(0<=n<=10^100). - 输出
- 输出栈操作后的结果。
- 样例输入
-
789 75948
- 样例输出
-
987 98457
本质上是栈贪心
思路:str保存初始数字,res为结果数组并结合top模拟栈操作,在s<strlen(str)时,从s(初始为0)开始先扫描str中还未入栈的数字,
获得最大数字对应的下标index,同时更新maxchar,然后将res数组中不小于maxchar的依次输出,接着将str扫描的起始点s到index(不包括index)中元素入res,随即在index<strlen(str)时,输出index对应的数字,并更新s为index+1,最后,在str的数字已全都入栈而栈不为空时,元素出栈直至为空#include <stdio.h> #include <string.h> char str[102],res[102]; int top; void MaxNum(){ int s,len,index,i; char maxchar; s=0,len=strlen(str); while(s<len){ maxchar='0'; for(i=s;i<len;i++) if(str[i]>maxchar){ maxchar=str[i]; index=i; } if(maxchar=='0') index=len; //还未入栈的数字全为0 for(i=top;i>=0;i--){ if(res[i]>=maxchar) putchar(res[i]);//输出不小于当前最大数字的数字 else break; } top=i;//更新top for(i=s;i<index;i++) res[++top]=str[i]; if(index!=len) putchar(str[index]);//输出当前最大数字 s=index+1; } for(i=top;i>=0;i--) putchar(res[i]); puts(""); } int main(){ while(~scanf("%s",str)){ top=-1; MaxNum(); } return 0; }
参照: `````````````````````````````````````````````````TC_赵坤垚``````````````````````````````````````````````````````