NYOJ-挑剔的小杜

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/basketball616/article/details/86620698

题目描述

小杜一直都不喜欢数学,但是他特爱语文,所以对英语也非常感兴趣。所以他也就有个习惯,一看到字母里面插有数字,一定要把他全部划去。

现在给你纸,纸上有很多既含有字母,又含有数字的句子(还包括一些标点符号)。你需要将数字找出来放在一边,并组成一个最大的数。然后逆序输出所有字母,和那个最大的数。

输入

第一行:N表示有多少组数据。
接下来的N行,每行有一句话,长度不超过1000。

输出

每句话对应输出两行。
第一行输出字母的总个数及其所有的字母(按原来输入的相反的顺序输出),中间需要一个空格分开。
第二行输出那个数字的总个数及最大的数,中间需要一个空格分开。
(如果没有字母或数字,则对应只需要输出一个0)

样例输入

2
abcabc123abc.
aaa

样例输出

9 cbacbacba
3 321
3 aaa
0

提示

如果数字只有多个0,请全部输出

时间限制:1秒 内存限制:128兆

分析:先统计字符串中字母和数字的个数,同时按桶排序思想将其中的数字归类。再倒序输出字符串中字母个数,然后按桶排序倒序输出即可。

#include<stdio.h>
#include<string.h>
const int M=1e3+5;
int a[20],x,i,j,k,len,sum1,sum2;
char str[M];
int main()
{
	scanf("%d",&x);//输入测试数据量
	while(x--)
	{
		sum1=sum2=0;
		memset(a,0,sizeof(a));//初始化
		scanf("%s",str);
		len=strlen(str);
		for(i=len-1;i>=0;i--)//先统计字符串中子母和数字的数量
		{
			if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z')
				sum1++;
			else if(str[i]>='0'&&str[i]<='9')
			{
				a[str[i]-'0']++;sum2++;//同时对其中的数字进行桶排序
			}
		}
		printf("%d ",sum1);//输出字符串中字母的数量
		for(i=len-1;i>=0;i--)//倒序输出字符串中的字母
		{
			if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z')
			printf("%c",str[i]);
		}
		printf("\n");
		printf("%d ",sum2);//输出字符串中数字的数量
		for(i=9;i>=0;i--)//对数字进行桶排序输出
		if(a[i]!=0)
		{
			for(j=1;j<=a[i];j++)
			printf("%d",i);
		}
		printf("\n");
	}
}

 

展开阅读全文

没有更多推荐了,返回首页