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过不了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)