将号码统一表示成int型,利用数组存储,排序,遍历排序后的结果找出有副本的号码。最初尝试使用链表,但运行超时,可能是测试数据中有大量无副本的号码,导致频繁的malloc消耗了过多时间。
可以AC的代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100000
int L[MAX], R[MAX];
int InputToDigit(char c);
void sort(int *tab, int i, int k);
void merge(int *tab, int i, int j, int k);
int
main()
{
int i,k,n,number;
int noDup = 1;
char str[1000];
int *table,*p,*t;
scanf("%d", &n);
p = table = (int *)malloc(sizeof(int)*n);
// ½¨Á¢ºÅÂë±í
for(i=0; i<n; i++) {
scanf("%s", str);
k = 0;
number = 0;
while(str[k]) {
if(str[k] == '-') {
k++;
continue;
}
number *= 10;
number += InputToDigit(str[k]);
k++;
}
*p++ = number;
}
sort(table,0,n-1);
// ²éÕÒºÅÂë±í
p = table;
while(p-table<n-1) {
t = p;
while(*p == *t)
p++;
if(p-t>1) {
printf("%03d-%04d %d\n",*t/10000
,*t%10000
,p-t);
noDup = 0;
}
}
if(noDup)
printf("No duplicates.\n");
return 0;
}
int
InputToDigit(char c)
{
if(c == 'P' || c == 'R' ||c == 'S') {
return 7;
} else if(c >= 'A' && c <= 'O') {
return (c - 'A')/3 + 2;
} else if(c >= 'T' && c <= 'Y') {
return (c - 'T')/3 + 8;
} else if(c >= '0' && c <= '9') {
return c -'0';
}
return -1;
}
void
sort(int *tab, int i, int k)
{
int m;
if(i<k){
m = (i+k) / 2;
sort(tab, i, m);
sort(tab, m+1, k);
merge(tab, i, m, k);
}
}
void
merge(int *tab, int i, int j, int k)
{
int m,n,n1,n2;
int *p = tab + i;
n1=j-i+1;
n2=k-j;
memcpy(L, tab+i, n1*sizeof(int));
memcpy(R, tab+j+1, n2*sizeof(int));
m=n=0;
while(m<n1 && n<n2) {
if(L[m] < R[n]) {
*p++ = L[m++];
} else {
*p++ = R[n++];
}
}
for( ; m< n1; m++) {
*p++ = L[m];
}
for( ; n< n2; n++) {
*p++ = R[n];
}
}
超时的代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100000
int L[MAX], R[MAX];
typedef struct _PhoneBookNode {
int number;
int count;
struct _PhoneBookNode *next;
} PhoneBookNode;
int InputToDigit(char c);
void AddNumberToPhoneBook(PhoneBookNode *list, int num);
int getCount(int num, PhoneBookNode *list);
void sort(int *tab, int i, int k);
void merge(int *tab, int i, int j, int k);
int
main()
{
int i,k,n,number;
int noDup = 1;
char str[1000];
int *table;
PhoneBookNode *Head;
Head = (PhoneBookNode *)malloc(sizeof(PhoneBookNode));
Head->number = 0;
Head->count = 0;
Head->next = NULL;
scanf("%d", &n);
table = (int *)malloc(sizeof(int)*n);
// ½¨Á¢ºÅÂë±í
for(i=0; i<n; i++) {
scanf("%s", str);
k = 0;
number = 0;
while(str[k]) {
if(str[k] == '-') {
k++;
continue;
}
number *= 10;
number += InputToDigit(str[k]);
k++;
}
AddNumberToPhoneBook(Head, number);
}
// ²éÕÒºÅÂë±í
PhoneBookNode *p;
p=Head;
n=0;
while(p!=NULL) {
if(p->count > 1) {
table[n++] = p->number;
noDup = 0;
}
p = p->next;
}
if(noDup)
printf("No duplicates.\n");
sort(table,0,n-1); // !!!here [0..n-1]
for(i=0; i<n; i++) {
// printf Êä³ö²¹0
printf("%03d-%04d %d\n",table[i]/10000
,table[i]%10000
,getCount(table[i],Head));
}
return 0;
}
int
getCount(int num, PhoneBookNode *list)
{
PhoneBookNode *p = list;
while(p!=NULL) {
if(p->number == num)
return p->count;
p = p->next;
}
return -1;
}
int
InputToDigit(char c)
{
if(c == 'P' || c == 'R' ||c == 'S') {
return 7;
} else if(c >= 'A' && c <= 'O') {
return (c - 'A')/3 + 2;
} else if(c >= 'T' && c <= 'Y') {
return (c - 'T')/3 + 8;
} else if(c >= '0' && c <= '9') {
return c -'0';
}
return -1;
}
void
AddNumberToPhoneBook(PhoneBookNode *list, int num)
{
PhoneBookNode *p;
p = list;
while(p!=NULL) {
if(p->number == num) {
p->count++;
return;
}
p=p->next;
}
p = (PhoneBookNode *)malloc(sizeof(PhoneBookNode));
p->number = num;
p->count = 1;
p->next = list->next;
list->next = p;
return;
}
void
sort(int *tab, int i, int k)
{
int m;
if(i<k){
m = (i+k) / 2;
sort(tab, i, m);
sort(tab, m+1, k);
merge(tab, i, m, k);
}
}
void
merge(int *tab, int i, int j, int k)
{
int m,n,n1,n2;
int *p = tab + i;
n1=j-i+1;
n2=k-j;
memcpy(L, tab+i, n1*sizeof(int));
memcpy(R, tab+j+1, n2*sizeof(int));
m=n=0;
while(m<n1 && n<n2) {
if(L[m] < R[n]) {
*p++ = L[m++];
} else {
*p++ = R[n++];
}
}
for( ; m< n1; m++) {
*p++ = L[m];
}
for( ; n< n2; n++) {
*p++ = R[n];
}
}