[C++] 844 -- 电话号码


例题描述

在这里插入图片描述

上图是一个电话的九宫格,如你所见一个数字对应一些字母,因此在国外企业喜欢把电话号码设计成与自己公司名字相对应。
例如公司的Help Desk号码是4357,因为4对应H3对应E5对应L7对应P,因此4357就是HELP
同理,TUT-GLOP就代表888-4567310-GINO代表310-4466

NowCoder刚进入外企,并不习惯这样的命名方式,现在给你一串电话号码列表,请你帮他转换成数字形式的号码,并去除重复的部分。

  • 输入描述:
    输入包含多组数据。
    每组数据第一行包含一个正整数n1 ≤ n ≤ 1024)。
    紧接着n行,每行包含一个电话号码,电话号码仅由连字符“-”、数字和大写字母组成。
    没有连续出现的连字符,并且排除连字符后长度始终为7(美国电话号码只有7位)。

  • 输出描述:
    对应每一组输入,按照字典顺序输出不重复的标准数字形式电话号码,即“xxx-xxxx”形式。
    每个电话号码占一行,每组数据之后输出一个空行作为间隔符。

示例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 4 UTT-HELP TUT-GLOP 310-GINO 000-1213
  • 输出:
    310-1010 310-4466 487-3279 888-1200 888-4567 967-1111 000-1213 310-4466 888-4357 888-4567

解题思路

  1. 先用hash表存储字母和数字之间的映射关系。
  2. 每次读到一个字符, 去hash表中查找, 并进行处理即可。

代码实现一

#include<iostream>
#include<string>
#include <set>
#include <unordered_map>

using namespace std;

int main() {
	unordered_map<char, char> dic;
	dic.emplace('A', '2');
	dic.emplace('B', '2');
	dic.emplace('C', '2');
	dic.emplace('D', '3');
	dic.emplace('E', '3');
	dic.emplace('F', '3');
	dic.emplace('G', '4');
	dic.emplace('H', '4');
	dic.emplace('I', '4');
	dic.emplace('J', '5');
	dic.emplace('K', '5');
	dic.emplace('L', '5');
	dic.emplace('M', '6');
	dic.emplace('N', '6');
	dic.emplace('O', '6');
	dic.emplace('P', '7');
	dic.emplace('Q', '7');
	dic.emplace('R', '7');
	dic.emplace('S', '7');
	dic.emplace('T', '8');
	dic.emplace('U', '8');
	dic.emplace('V', '8');
	dic.emplace('W', '9');
	dic.emplace('X', '9');
	dic.emplace('Y', '9');
	dic.emplace('Z', '9');
	int n;
	while (cin >> n && n > 0) {
		set<string> hs;
		string s;
		for (int i = 0; i < n; ++i) {
			cin >> s;
			string p = "";
			for (auto& c : s) {
				if (isdigit(c)) p += c;
				else if (isupper(c)) p += dic[c];
			}
			if (p.size() != 7) continue;
			p = p.substr(0, 3) + "-" + p.substr(3);
			hs.emplace(p);
		}
		for (auto& phone : hs) cout << phone << endl;
		cout << endl;
	}
	return 0;
}

代码实现二

#include <iostream>
#include <string>
#include <set>

using namespace std;

int main(){
    string s;
    int length;
    string NUM = "22233344455566677778889999";
    while (cin >> length){
        set<string> data;
        int cnt;
        for (int i = 0; i < length; i++){
            cnt = 0;
            string res;
            cin >> s;
            for (int j = 0; j < s.length(); j++){
                if (s[j] >= 'A'&&s[j] <= 'Z'){
                    res += NUM[s[j] - 'A'];
                    cnt++;
                    if (cnt == 3)
                        res += "-";
                }
                else if (s[j] >= '0'&&s[j] <= '9'){
                    res += s[j];
                    cnt++;
                    if (cnt == 3)
                        res += "-";
                }
            }
            data.insert(res);
        }
        for (set<string>::iterator it = data.begin(); it != data.end(); it++)
            cout << *it << endl;
        cout << endl;
    }
    return 0;
}

链接:https://www.nowcoder.com/questionTerminal/ceb89f19187b4de3997d9cdef2d551e8

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

giturtle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值