寻求最大数(二)
寻找最大数(二)
时间限制: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_赵坤垚``````````````````````````````````````````````````````
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步