1002:方便记忆的电话号码(string, map)

总时间限制:2000ms 内存限制:65536kB

描述

英文字母(除Q和Z外)和电话号码存在着对应关系,如下所示:

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

标准的电话号码格式是xxx-xxxx,其中x表示0-9中的一个数字。有时为了方便记忆电话号码,我们会将电话号码的数字转变为英文字母,如把263-7422记成America。有时,我们还加上“-”作为分隔符,如把449-6753记成Hi-World。当然,我们未必要将所有的数字都转变为字母,比如474-6635可以记成iPhone-5。

总之,一个方便记忆的电话号码由数字和除Q、Z外的英文字母组成,并且可以在任意位置插入任意多的“-”符号。

现在 ,我们有一个列表,记录着许多方便记忆的电话号码。不同的方便记忆的电话号码可能对应相同的标准号码,你的任务就是找出它们。

 

输入

第一行是一个正整数n(n <= 100000),表示列表中的电话号码数。
其后n行,每行是一个方便记忆的电话号码,它由数字和除Q、Z外的英文字母、“-”符号组成,其中数字和字母的总数一定为7,字符串总长度不超过200。

输出

输出包括若干行,每行包括一个标准电话号码(xxx-xxxx)以及它重复出现的次数k(k >= 2),中间用空格分隔。输出的标准电话号码需按照升序排序。

如果没有重复出现的标准电话号码,则输出一行“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 

思路很简单就是直接模拟,有“-”的去“-”,有字母的转换成数字,然后放到map中计数

涉及到了string的插入和map的遍历,就当是复习C++了……

在c++中有两个关联容器,第一种是map,内部是按照key排序的,第二种是unordered_map,容器内部是无序的,使用hash组织内容的。

如果在有序的map中,key是int,或者string,它们天然就能比较大小,本身的就是有序的。不用额外的操作。

当然也可以按value排序,https://www.cnblogs.com/eilearn/p/9473804.html

以下ac代码:

#include <iostream>
#include <map>
#include <string>
using namespace std;
int turn(char a){
	
	if(a == 'A' || a == 'B' || a == 'C') return 2;
	
	if(a == 'D' || a == 'E' || a == 'F') return 3;
	
	if(a == 'G' || a == 'H' || a == 'I') return 4;
	
	if(a == 'J' || a == 'K' || a == 'L') return 5;
	
	if(a == 'M' || a == 'N' || a == 'O') return 6;
	
	if(a == 'P' || a == 'R' || a == 'S') return 7;
	
	if(a == 'T' || a == 'U' || a == 'V') return 8;
	
	if(a == 'W' || a == 'X' || a == 'Y') return 9;
	
	
}
int main()
{
	int n;
	
	map<string, int> mp;
	
	
	cin>>n;
	
	while(n--){
		
		string str;
		string temp;
		
		cin >> str; 
		
		for(int i = 0; i < str.length(); i++){
			
			if( str[i] == '-') continue;
			
			else if( str[i]>= 'A' && str[i] <= 'Z'){
				
				char t = turn(str[i]) + '0';
				
				temp = temp + t;
				
			}else{
				
				temp = temp + str[i];
				
			}
			
		}
		
//		cout<<temp<<endl<<endl;
		
		mp[temp]++;
	}
	
	map<string, int> :: iterator iter;
	
	iter = mp.begin();
	
	bool flag = 1;
	
	while(iter != mp.end()){
		
		if(iter->second >= 2){
			
			flag = 0;
			
			string t = iter->first;
			
			t.insert(3, "-");
			
			cout<< t <<" "<< iter->second <<endl;
			
		}
		
		iter++; 
	}
	
	if(flag) cout<<"No duplicates."<<endl;
	
	return 0;
 } 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值