一、题目详情
二、题目解析
(1) 题目说电话号码有多种形式:纯数字,数字与字母结合,纯英文
(2) 题目还给出了多组映射关系:
A,B和C映射到2
D、E和F映射到3
G,H,I映射到4
J,K和L映射到5
M,N和O映射到6
P,R和S映射到7
T,U和V映射到8
W,X和Y映射到9
Q和Z没有对应关系
连字符‘ - ’可以忽略
以此我们可以将任意号码化为纯数字的标准形式
TUT-GLOP is 888-4567
310-GINO is 310-4466
3-10-10-10 is 310-1010.
(3) 题目提供多组数据,要求我们将其标准化,并按升序格式输出,输出的同时输出出现次数,如果输入中没有重复项则输出No duplicates.
例如:
12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279
结果为
310-1010 2
487-3279 4
888-4567 3
(4) 本文提供了一种较为简便但耗费大的方法:将电话号码标准化后以下标的形式储存起来,接下来就遍历这个数组,按题目要求的格式输出。
- 由于数组的长度非常大,所以遍历起来耗时间长,但这样做的好处是省去了排序的步骤。
三、代码示例
以下为纯C代码
#include <stdio.h>
#define MAXN 10000000 //电话号码数字最多为7位
int b[MAXN + 1] = { 0 };
int map(char c) //映射关系
{
if ('0' <= c && c <= '9')
return c - '0';
else if (c == 'A' || c == 'B' || c == 'C')
return 2;
else if (c == 'D' || c == 'E' || c == 'F')
return 3;
else if (c == 'G' || c == 'H' || c == 'I')
return 4;
else if (c == 'J' || c == 'K' || c == 'L')
return 5;
else if (c == 'M' || c == 'N' || c == 'O')
return 6;
else if (c == 'P' || c == 'R' || c == 'S')
return 7;
else if (c == 'T' || c == 'U' || c == 'V')
return 8;
else if (c == 'W' || c == 'X' || c == 'Y')
return 9;
else
return -1;
}
int main()
{
int n;
char a[101];
scanf("%d", &n);
while (n--) //输入数据并将其化为数组下标的形式
{
scanf("%s",a);
int tel = 0;
for (int j = 0; a[j]; j++)
{
int t = map(a[j]);
if (t == -1)
{
continue;
}
tel = tel * 10 + t;
}
b[tel]++;
}
int flag = 0; //判断是否有重复项
for (int i = 0; i < MAXN; i++)
{
if (b[i] > 1)
{
flag = 1;
printf("%d-%d %d\n", i / 10000, i % 10000, b[i]);//标准化输出
}
}
if (flag == 0)
{
printf("No duplicates.\n");
}
return 0;
}