水题系列二:PhoneNumbers

Posted drq1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了水题系列二:PhoneNumbers相关的知识,希望对你有一定的参考价值。

问题描述:

Phonenumbers 企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一 个容易记 住的 单词或 者短语 。例如 ,你 需要给 滑铁卢 大学打 电话时 ,可 以拨打 TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过 拨打 310-GINO 来向 Gino‘s 订一份 pizza。让电话号码容易被记住的另一个办法是以一种好 记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码 3-10-10-10,你可以 从他们那里订 pizza。电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有 一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下:

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。 

★编程任务 

如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号) ,你的公司正在 为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多 个公司拥有相同的电话号码。

★数据输入

 输入的格式是,第一行是一个正整数,指定电话号码薄中号码的数量(最多 100000)。 余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了 Q 和 Z)以及连接符 组成。每个电话号码中只会刚好有 7 个数字或者字母。

★数据输出

 对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是 它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中 没有重复的号码,输出一行:No duplicates.

#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;

//用于映射电话中的字母数组,为了方便,把Q,Z位置初始化为0
int number[26]={ 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 0, 7, 7, 8, 8, 8, 9, 9, 9, 0};
int numList[100000];
int size=0;

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        //把每个输入的号码字符串直接转换成一个7位数字并放入数组。
        char numStr[20];
        int num=0;
        cin>>numStr;
        int len=strlen(numStr);
        for(int i=0;i<len;i++)
        {
            char c=numStr[i];
            if(c>=0&&c<=9)
                num=num*10+(c-0);
            else if(c>=A&&c<=Y&&c!=Q)
                num=num*10+(number[c-A]);
        }
        numList[size++]=num;
    }

    //先进行一次排序,之后输出时候就可以按照顺序,并且为后面的处理提供方便。
    sort(numList,numList+size);
    //用于标识是否有从夫,true标识没有重复
    bool flag=true;
    int repeat =1;
    for(int i=0;i<size;i++)
    {
        if(numList[i]==numList[i+1])++repeat;
        else if(repeat>1)
        {
            int a=numList[i]/10000;
            int b=numList[i]%10000;
            printf("%03d-%04d %d
",a,b,repeat);
            repeat=1;
            blag=flase;
        }
        if(flag)
        {
            printf("No duplicates.
");
            return 0;
        }
    }
}

 

以上是关于水题系列二:PhoneNumbers的主要内容,如果未能解决你的问题,请参考以下文章

获取python phonenumbers 库中数字的匹配区域

Scala - 将字符串数组转换为Set [PhoneNumbers]

在 Lambda 中使用三元运算符的替代方法

无法使用 - auth/user.phonenumbers.read 范围从用户的谷歌个人资料中读取电话号码

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

水题 codeforces 133A - HQ9+ && sting类find系列函数简单总结