写在前面
你好!欢迎来到我的博客,希望我的思路能够帮到你!
问题描述
每个人都喜欢有令人难忘的电话号码。要想让电话号码变得令人难忘的一种方法是拼出一个令人难忘的单词或短语。例如,你可以拨打滑铁卢大学的电话,拨打令人难忘的电话号码TUT-GLOP。有时只有一部分号码被用来拼写一个单词,例如,你可以拨打310-gino从Gino’s订购披萨。
要使电话号码令人难忘的另一种方法是以一种令人难忘的方式对数字进行分组。
你可以从比萨饼小屋中订购比萨饼,方法是拨打他们的“3个10”,即号码3-10-10-10。
电话号码的标准格式是七位的十进制数字,第三和第四位之间包含连字符(例如888-1200)。
电话的键盘提供字母到数字的映射,如下所示:
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的标准格式是888-4567,
310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。
当两个电话号码有相同的标准格式时是等价的(拨同样的号码)。
你的公司正在编制本地企业的电话号码目录,作为质量控制的一部分,
你需要检查没有两个(或多个)企业具有相同的电话号码。
输入形式
输入包括一个案例。输入的第一行为一个正整数,指定目录中电话号码的数目(最多100,000)。其余的各行列出目录中的电话号码,每个号码单独占一行。每个电话号码都是一个由十进制数字、大写字母(不包括Q和z)和连字符组成的字符串。字符串中的七个字符或是数字或是字母。
输出形式
对于出现超过一次的每个号码,按照标准格式每个输出一行,然后是空格,接着输出出现的次数。只出现1次的电话号码不输出。
样例输入
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
解题思路
读完题,这道题的关键词:次数,映射,连字符,我们可以想到,这道题可以用map来解,map中的元素是一个个的对组pair,在这道题中,我们将电话号码作为key,而出现次数作为value,因为map有自动对容器内元素排序的特性,故这道题我们省去了自行排序的过程。
这道题还有一个难点在于对电话号码的处理,题目中说Q,Z没有映射,且输入中不存在Q和Z,所以我们可以放心大胆的对题目所给串进行处理。
AC代码
#include<iostream>
#include<string>
#include<map>
using namespace std;
map<string,int> m;
map<string,int>::iterator itm;
string transfer(string s)//这里是将输入转化为标准形式的函数的定义和声明
{
string temp;
for(int i=0;i