寻求最大数(二)

寻找最大数(二)

时间限制: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_赵坤垚``````````````````````````````````````````````````````

 
posted @   我在这儿  阅读(211)  评论(0编辑  收藏  举报

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示