POJ1002 487-3279

描述
商人们喜欢使用方便记忆的电话号码。让号码方便记忆的一种方法是让它拼成好记的单词或词组。例如,你可以叫Waterloo大学TUT-GLOP。有时候只有数字的一部分参与拼写。当你回到家你可以打310-GINO预订Gino的披萨。另外一种使电话号方便记忆的方法是分组。你可以通过拨打3-10-10-10(三个十)预定Hut披萨。
电话号的标准格式是7个数字,第3、4个数字间以分隔符"-"连接。电话号和英文字母的转换面板如下:
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)和分隔符。每行有7个字符是数字或字母。
输出
输出那些出现超过一次的电话号。标准形式是电话号的标准格式+一个空格+电话号出现的次数。以电话号的字典序升序排列。如果没有出现超过一次的电话号,输出:
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
来源
1999 北美中东部

参考代码

复制代码
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int data[100005];
int change(char*tmp){
    int res = 0,p = 0,t; 
    bool flag;
    for(int i=0;i<strlen(tmp);i++){
        flag = false;
        if(tmp[i]>='0'&&tmp[i]<='9'){
             t = tmp[i]-'0';
             flag = true;
        }else if(tmp[i]>='A'&&tmp[i]<='Z'){
            flag = true;
            switch(tmp[i]){
                case 'A':
                case 'B':
                case 'C':
                    t = 2;
                    break;
                case 'D':
                case 'E':
                case 'F':
                    t = 3;
                    break;
                case 'G':
                case 'H':
                case 'I':
                    t = 4;
                    break;
                case 'J':
                case 'K':
                case 'L':
                    t = 5;
                    break;
                case 'M':
                case 'N':
                case 'O':
                    t = 6;
                    break;
                case 'P':
                case 'R':
                case 'S':
                    t = 7;
                    break;
                case 'T':
                case 'U':
                case 'V':
                    t = 8;
                    break;
                case 'W':
                case 'X':
                case 'Y':
                    t = 9;
            }
        }
        if(flag){
            res = res*10+t;
            p++;
            if(p==7){
                return res;
            }
        }
    }
}
int main(){
    int n,kase = 0,count;
    char tmp[80];
    scanf("%d",&n);
    bool flag = false;
    while(n--){
        scanf("%s",tmp);
        data[kase++] = change(tmp);
    }
    sort(data,data+kase);
    count = 1;
    for(int i=1;i<kase;i++){
        if(data[i-1]==data[i]){
            flag = true;
            count++;
        }else{
            if(count>1){
                printf("%03d-%04d %d\n",data[i-1]/10000,data[i-1]%10000,count);
                count = 1;
            }
        }
    }
    if(count>1){
        printf("%03d-%04d %d\n",data[kase-1]/10000,data[kase-1]%10000,count);
    }
    if(!flag){
        printf("No duplicates.\n");
    }
    return 0;
}
复制代码

思路
将每一个电话号码映射成一个7位数字,将所有的数字升序排列,自然就得到了每个电话号的重复数,再按要求输出,
注意事项
(1)如果数字是0的时候的电话号码会缺位,要参考%03d-%04d这种输出格式

(2)tmp字符串变量的长度要开大一些,20过不了

posted @   智人心  阅读(19)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示