英文字母(除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行,每行是一个方便记忆的电话号码,它由数字和除Q、Z外的英文字母、“-”符号组成,其中数字和字母的总数一定为7,字符串总长度不超过200。
如果没有重复出现的标准电话号码,则输出一行“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
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std ; int cmp(const void* a,const void* b) { return *(int*)a - *(int*)b ; } int main() { char T[27] = "2223334445556667-77888999-" ; int N ; cin>>N ; getchar() ; int *a = new int[N+1] ; int i = 0; char c ; for(;i<N;i++){ a[i]= 0 ; while((c=getchar())!='\n') { if(c>='A'&&c<='Z') c=T[c-'A'] ; if('-'!=c) a[i]=a[i]*10+c-'0' ; } } qsort(a,i,sizeof(int),cmp) ; int k = 1 ,n=0; for(i=0;i<=N;i++) { if(a[i]==a[i+1]) k++ ; else if(k>=2){ int b = a[i]/10000 ; int d = a[i]%10000 ; // cout<<b<<'-'<<d<<" "<<k<<endl ; printf("%03i-%04i %i\n",b,d,k); k=1; n++ ; } } if(0==n) printf("No duplicates.\n"); return 0 ; }1.用字符数组存储需要转变的值
2.然后剔除里面的其他无用字符,用一个新字符串保存
3.把字母转化为数字保存,然后把新字符串转为为一个int型
保存在数组中,然后由小到大排序,输出时把数拆开,加个'-',变成字符串再输出
import java.util.Arrays; import java.util.Scanner; /** * acm1002 * @author tanlvxu * */ public class Main{ /** * @param args */ public static void main(String[] args) { Scanner sc = new Scanner(System.in) ; int n = sc.nextInt() ; int a[] = new int[n] ; String str[] = new String[n] ; char T[] = {'2','2','2','3','3','3','4','4','4','5','5','5','6', '6','6','7','-','7','7','8','8','8','9','9','9','-'} ; for(int i=0;i<n;i++) { str[i] = sc.next(); char c ; String s1 = "" ; for(int j=0;j<str[i].length();j++) { if(str[i].charAt(j)>='A' && str[i].charAt(j)<='Z') { c = T[str[i].charAt(j)-'A'] ; s1 = s1+c ; }else if(str[i].charAt(j)>='0'&&str[i].charAt(j)<='9') { s1 += str[i].charAt(j) ; } } //System.out.println(s1) ; a[i] = Integer.parseInt(s1) ; } Arrays.sort(a) ; int k=1,l=0 ; for(int i=0;i<n-1;i++) { if(a[i]==a[i+1]) { k++; } else if(k>=2) { int b=a[i]/10000,d=a[i]%10000 ; System.out.printf("%03d-%04d %d\n",b,d,k); k=1 ; l++ ; } } if(0==l) System.out.println("No duplicates.") ; } }
或者:
package dsa ; import java.util.Arrays; import java.util.Scanner; /** * acm1002 * @author tanlvxu * */ public class Demo6{ /** * @param args */ public static void main(String[] args) { ui(); } public static void ui() { Scanner sc = new Scanner(System.in) ; int n = sc.nextInt() ; String str[] = new String[n] ; for(int i=0;i<n;i++) { str[i] = process(sc.next()); } Arrays.sort(str) ; int k=1,l=0 ; for(int i=0;i<n-1;i++) { if(str[i].equals(str[i+1])) { k++; } else if(k>=2) { String b = str[i].substring(0,3); String d = str[i].substring(3); System.out.print(b+"-"+d+" ") ; System.out.println(k) ; k=1 ; l++ ; } } if(0==l) System.out.println("No duplicates.") ; } public static String process(String str1) { int c ; String s1 = "" ; for(int j=0;j<str1.length();j++) { if(str1.charAt(j)>='A' && str1.charAt(j)<'Q') { c = str1.charAt(j)-'A' ; c = c/3 + 2 ; s1 = s1+c ; }else if(str1.charAt(j)>'Q' && str1.charAt(j)<'Z') { c = str1.charAt(j)-'A' +2; c = c/3 + 1 ; s1 = s1+c ; } else if(str1.charAt(j)>='0'&&str1.charAt(j)<='9') { s1 += str1.charAt(j) ; } } return s1 ; } }
解决方案3:哈希解法
package dsa; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Scanner; /** * acm1002 * @author tanlvxu * */ public class Demo6{ /** * @param args */ public static void main(String[] args) { //定义一个哈希表 Map<String,Integer> map = new HashMap<String,Integer>(); Scanner sc = new Scanner(System.in) ; int n = sc.nextInt() ; for(int i=0;i<n;i++) { String tempString = sc.next() ; tempString = process(tempString) ; String tempString1 = tempString.substring(0, 3) ; String tempString2 = tempString.substring(3) ; tempString = tempString1 + "-" + tempString2 ; //判断表是否包含了该元素 if(map.containsKey(tempString)){ //如果包含该元素,就把原来的表中元素移除掉,value + 1 Object object = map.get(tempString) ; int value = Integer.parseInt(object.toString()) ; value += 1 ; map.remove(value) ; map.put(tempString, Integer.parseInt(value+"")); }else { //如果不存在该元素,就直接添加 map.put(tempString,Integer.parseInt("1")) ; } } //创建迭代器 Iterator it = map.entrySet().iterator() ; List<String> list = new ArrayList<String>() ; while(it.hasNext())//如果仍有元素可以迭代,则返回 true。 { //得到映射项 Map.Entry entry = (Map.Entry) it.next() ; //返回迭代的下一个元素。 Object key = entry.getKey() ; Object value = entry.getValue() ; int p = Integer.parseInt(value.toString()) ; //如果存在重复的元素,则添加到list表中 if(p>1){ list.add(key +" "+value) ; } } Collections.sort(list) ;//对list进行排序 if(list.size() == 0) { System.out.println("No duplicates."); }else{ for (int l = 0; l < list.size(); l++) { System.out.println(list.get(l)); } } } public static String process(String str) { String tempString = "" ; for(int i=0;i<str.length();i++) { char te = str.charAt(i) ; if(te>='0'&&te<='9'){ tempString = tempString + te ; }else if(te>='A' && te<'Q'){ int temp = te - 'A' ; temp = temp/3 + 2 ; tempString = tempString + temp ; }else if(te>'Q' && te<'Z'){ int temp = te - 'A' + 2; temp = temp/3 + 1; tempString = tempString + temp ; } } return tempString ; } }
相关推荐
FR1002人脸识别模组具备完整的人脸处理能力,可以在无需上位机参与的情况下,完成人脸录入,图像处理,人脸比对,人脸特征储存等功能。和同类人脸产品相比,具有以下特色:❖ 高性能算法芯片❖ 双目 3D 摄像头模组❖...
【标题】"ZOJ 1002" 是一个在线编程竞赛题目,源自ZOJ(Zhejiang Online Judge),这是一个面向ACM/ICPC(国际大学生程序设计竞赛)的在线评测系统。题目编号1002,通常表示该题是ZOJ平台上的一个问题,可能涉及算法...
FR1002人脸识别模块结合stm32实现3D红外人脸识别,并配合超声波模块触发人脸识别。FR1002人脸识别模组解决方案以高性能应用处理器为硬件平台,配合双目传感器进行活体检测,具有启动速度快、金融级的识别能力、超低...
《TDS 1002示波器说明书》是一份详细指导文档,它为用户提供如何使用TDS1000和TDS2000系列数字存储示波器的操作知识。这份说明书涵盖了从产品介绍、保修概要到具体使用方法的方方面面,让用户能够充分了解和发挥示波...
《EQ1002单色LED显示屏控制软件详解》 LED显示屏作为一种广泛应用的现代显示技术,广泛用于广告、信息传播、舞台背景等多个领域。而控制软件则是LED显示屏正常运行的关键,它负责对屏幕进行编程、编辑和管理。本文...
RP-1002E是NOTIFIER公司的一款气体灭火控制器,这款设备主要用于自动监测和控制保护区域内的火灾情况,确保在火源初起时能够及时、准确地启动气体灭火系统。用户手册是操作和维护此类设备的重要参考资料,下面将详细...
从提供的文件信息来看,这份文档是关于诺蒂菲尔公司(Notifier)的RP-1002E气控盘的使用手册。根据文件中的标签和部分内容,我们可以了解到该设备的一些基本信息,比如制造商的联系方式和网站地址。 根据文件内容,...
《ch1002-95测绘产品检查验收规定》是中华人民共和国测绘行业的一个重要标准,旨在规范测绘产品的质量检查和验收流程,确保测绘产品符合国家标准和行业标准,保障测绘成果的准确性和可靠性。该标准详细规定了测绘...
ASTM C1002.pdf ASTM C1002.pdf 是一种关于钢自穿螺钉的标准规范,用于将石膏板产品或金属粉刷基座连接到木 studs 或钢 studs 上。 知识点1:钢自穿螺钉的应用 ASTM C1002.pdf 规定了钢自穿螺钉的应用场景,包括...
标题 "ACM杭电1002 C++程序" 指向的是一个与ACM国际大学生程序设计竞赛相关的题目,具体是杭州电子科技大学(Hangzhou Dianzi University)在线评测系统上的第1002号问题。这个问题要求用C++编程语言来解决大数相加...
Hive JDBC 2.6.2.1002 是一个关键组件,它在大数据处理领域扮演着重要的角色。Hive 是由 Apache 软件基金会开发的一个数据仓库工具,它允许用户使用类 SQL 查询语言(HQL)来处理存储在分布式文件系统中的大规模数据...
### SPHE1002 eCos系统BMP图片设计向导 #### SPHE1002 eCos系统调色板 在SPHE1002 eCos系统中,调色板是一个非常重要的概念,它决定了BMP图片的颜色配置。调色板包含了一系列预定义的颜色值,这些颜色值用于构建...
### 杭电ACM1002解题分析与代码详解 #### 题目背景与解析 根据题目描述及代码内容,我们可以推断出这是一道关于大数加法处理的问题。通常情况下,整数的加法可以直接通过内置类型(如`int`或`long long`)来实现,...
《TDS1002B系列示波器使用说明书》是一个详细介绍如何操作和利用泰克(Tektronix)公司生产的TDS1002B系列示波器的指南。示波器是电子工程师、技术人员和科研人员在检测、调试电子设备时不可或缺的工具,它能显示信号...
### HMC10021/HMC1002中文数据手册详解 #### 一、产品概述 HMC10021与HMC1002是两款高性能磁传感器,专为一轴和二轴磁场检测而设计。这两款传感器能够提供高灵敏度、可靠性和成本效益,适用于多种应用领域,包括...
### hdoj1002——大整数相加 #### 题目背景与目的 本题目来源于杭州电子科技大学的在线评测系统(HDOJ),编号为1002的大整数相加问题。该题目主要考察的是编程者对于大整数处理的基本技巧以及对数组、循环等基础...
标题中的"ClouderaHiveJDBC41-2.6.2.1002.zip"指的是Cloudera发行的Hive JDBC驱动程序的压缩包文件,版本号为2.6.2.1002。这个驱动是用于Java应用程序与Hive数据仓库进行交互的桥梁,它实现了Java Database ...
1002型矢双面计算尺 用法说明书 上海计算尺厂 上海南昌路528号 1002型双面计算尺用法说明书
【标题】"UralACM1002(c++)"是一个与编程竞赛相关的主题,尤其在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)的范畴内。Ural ACM通常指的是乌拉尔大学(University of Ural)举办...