首页 > 其他 > 详细

POJ 1002 487-3279

时间:2014-04-02 08:56:44      阅读:315      评论:0      收藏:0      [点我收藏+]

【题意简述】:中文题,不再赘述!

【思路】:(1)、首先,将各种电话号码表示转换成标准表示:一个长度为 8 的字符串,前三个字符是数字、第 4 个字符是‘-‘、后四个字符是数字。

         (2)、根据电话号码的标准表示,搜索重复的电话号码。办法是对全部的电话号码进行排序,这样相同的电话号码就排在相邻的位置。此外,题目也要求在输出重复的电话号码时,要按照号码的字典升序进行输出。


因此:

用一个二维数组 p[100000][9]来存储全部的电话号码,每一行存储一个电话号码的标准表示。每读入一个电话号码,首先将其转换成标准表示,然后存储到二维数组telNumbers 中。全部电话号码都输入完毕后,将数组 p作为一个一维数组,其中每个元素是一个字符串,用C/C++提供的函数模板sort对进行排序。用字符串比较函数strcmp比较 p 中相邻的电话号码,判断是否有重复的电话号码、并计算重复的次数。

// 1024K 375Ms
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char m[]="22233344455566677778889999";
char p[100000][9],buf[1000];
int i,j,k,n,count,duplicate;

int compare(const void *elem1,const void *elem2)
{
	return (strcmp( (char*)elem1,(char*) elem2));
};
int main()
{
    scanf("%d\n",&n);
    for(i=0;i<n;i++)
   	{
		gets(buf);
        //忽略连字符 
        for(k=j=0;buf[j];j++)
        {
            if(buf[j]==‘-‘)
                continue;//忽略连字符
            if(buf[j]>=‘A‘&&buf[j]<=‘Z‘)
            {
                p[i][k]=m[buf[j]-‘A‘];
            }
            else if(buf[j]>=‘0‘ && buf[j]<=‘9‘)
            {
                p[i][k]=buf[j];
            }
            if(++k==3)
                p[i][k++]=‘-‘;//在第三位插入连字符
        }
    }
    qsort(p,n,9,compare);//对输入的电话号码进行排序
    duplicate=0;//0=没有重复,1=有重复的
    count=0;
    for(i=0;++i<=n;)//搜索重复的电话号码,并进行输出
    {
        count++;//重复次数
        if(strcmp(p[i-1],p[i]))
        {
            if(count>1)//因为已经排好了序,所以只要遇到不同的就说明重复结束 
            {
                printf("%s %d\n",p[i-1],count); 
                duplicate=1;//只要输出了1次就设置成0以外的值 
            }
            count=0;//重设出现次数 
        }
    }
    if(duplicate==0)
        puts("No duplicates.");
    return 0;
}




POJ 1002 487-3279,布布扣,bubuko.com

POJ 1002 487-3279

原文:http://blog.csdn.net/u013749862/article/details/22750971

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!