您的位置:首页 > 其它

北大在线测试系统(POJ)第1002题

2018-02-04 21:05 183 查看
原题请参考:http://poj.org/problem?id=1002

  这个题目我写了好几个版本的C程序,虽然都Accepted,但普遍用时较多,还需要进一步优化。下面这个程序是其中的一个,本来是想空间换时间,结果发现用时也超过了700MS。基本思想是:开辟一个大数组,数组元素的下标对应电话号码、元素值为该号码出现的次数。每读一个号码,号码对应的元素值加1。最后依次输出元素值大于1的数组下标(即电话号码)。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int duplicateCount = 0;

int main()
{
int i,j;
int num;
char map[25]= {'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','7','7','7','8','8','8','9','9','9'};
char temp;
char phoneNum[8];
int int_phoneNum;
int *count;
int duplicateFlag = 0;

count = (int *)malloc(10000000*sizeof(int));
memset(count,0,10000000*sizeof(int));
scanf("%d%c",&num,&temp);
for(i=0;i<num;i++)
{
j=0;
temp = getchar();
while(temp!='\n'&& temp!=EOF)
{
if(temp!='-')
{
if(temp>='A'&& temp<='Z')
phoneNum[j] = map[temp-65];
else
phoneNum[j] = temp;
j++;
}
temp = getchar();
}
int_phoneNum = atoi(phoneNum);
count[int_phoneNum]++;
if(count[int_phoneNum]==2)
duplicateCount++;
}

for(i=0;i<10000000;i++)
{
if(count[i]>1)
{
duplicateFlag = 1;
duplicateCount--;
printf("%03d",i/10000);
printf("-%04d",i%10000);
if(duplicateCount)
printf(" %d\n",count[i]);
else
{
printf(" %d",count[i]);
break;
}
}
}
if(duplicateFlag==0)
printf("No duplicates.");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  北大 acm poj 1002