poj 1002 487-3279

http://poj.org/problem?id=1002

题目大意:意思是说将某些字母对应成数字,然后找出输入的数据当中有多少个是重复出现的,将这些重复出现的输出,并且输出重复的次数。如果输入的数据都不相同,那么就输出“No duplicates. ”。

分析:首先得注意几点,虽然说最后的数字只有7个,但是在输入的时候因为会有“-”符号的出现,所以字符数组需要开大一点。还有就是对于0的处理。

我并没有把字符转换成整数,但是感觉转换成整数应该简单一点。

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
using namespace std;
char st[100000][300];
char m[300];
int aa[100005];
int cmp(const void* a, const void* b)
{
    return (strcmp((char* )a,(char* )b));
}
int main()
{
	int n,i,j,p,flag;
scanf("%d",&n);
	
		int sum=0;
		for(i=0;i<n;i++)
		{
			scanf("%s",st[i]);
			int len;
			len=strlen(st[i]);
			for(j=0;j<len;j++)
			{
				if(st[i][j]=='Q'||st[i][j]=='Z'||st[i][j]=='-')
				{
					p=j;
					while(p<len)
					{
						st[i][p]=st[i][p+1];	//处理掉‘-’
						p++;
					}
					j--;
					continue;
				}
				if(st[i][j]=='A'||st[i][j]=='B'||st[i][j]=='C')
					st[i][j]='2';
				if(st[i][j]=='D'||st[i][j]=='E'||st[i][j]=='F')
						st[i][j]='3';
				if(st[i][j]=='G'||st[i][j]=='H'||st[i][j]=='I')
						st[i][j]='4';
				if(st[i][j]=='J'||st[i][j]=='K'||st[i][j]=='L')
						st[i][j]='5';
				if(st[i][j]=='M'||st[i][j]=='N'||st[i][j]=='O')
						st[i][j]='6';
				if(st[i][j]=='P'||st[i][j]=='R'||st[i][j]=='S')
						st[i][j]='7';
				if(st[i][j]=='T'||st[i][j]=='U'||st[i][j]=='V')
						st[i][j]='8';
				if(st[i][j]=='W'||st[i][j]=='X'||st[i][j]=='Y')
						st[i][j]='9';

			}
		}
		qsort(st,n,sizeof(st[0]),cmp); //对字符数组进行排序
		memset(aa,0,sizeof(aa));
		strcpy(m,st[0]);
		flag=0;
		for(i=1;i<n;i++)  //开始寻找相同的字符数组
		{		
			if(strcmp(m,st[i])!=0||i==n-1)
			{	if(i==n-1&&strcmp(m,st[i])==0)//这里是当到最后一个的时候,对于最后一组和之前的是否相同,进行讨论
				aa[flag]=n-flag;
			else
				aa[flag]=i-flag;
				flag=i;
				strcpy(m,st[i]);

			}	
		}
		flag=0;
		for(i=0;i<n;i++)
		{
			if(aa[i]>1)
			{
				flag=1;
				for(j=0;j<3;j++)
					printf("%c",st[i][j]);
					printf("-");
				for(j;j<7;j++)
				printf("%c",st[i][j]);
				printf(" %d\n",aa[i]);
					
			}
		}
		if(flag==0)
		{
			printf("No duplicates. \n");
		}


	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值