`

1002

阅读更多
总时间限制:
2000ms
内存限制:
65536kB
描述
英文字母(除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(n <= 100000),表示列表中的电话号码数。
其后n行,每行是一个方便记忆的电话号码,它由数字和除Q、Z外的英文字母、“-”符号组成,其中数字和字母的总数一定为7,字符串总长度不超过200。
输出
输出包括若干行,每行包括一个标准电话号码(xxx-xxxx)以及它重复出现的次数k(k >= 2),中间用空格分隔。输出的标准电话号码需按照升序排序。

如果没有重复出现的标准电话号码,则输出一行“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 
 
解决方案一:G++
 
#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.用一个int型数组存储电话数
    3。对int型数组进行判断再输出
 
 
 
 
解决方案二:Java
 
 解决思路:
 
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人脸识别模块结合stm32实现3D红外人脸识别

    FR1002人脸识别模组具备完整的人脸处理能力,可以在无需上位机参与的情况下,完成人脸录入,图像处理,人脸比对,人脸特征储存等功能。和同类人脸产品相比,具有以下特色:❖ 高性能算法芯片❖ 双目 3D 摄像头模组❖...

    zoj 1002_zoj1002_

    【标题】"ZOJ 1002" 是一个在线编程竞赛题目,源自ZOJ(Zhejiang Online Judge),这是一个面向ACM/ICPC(国际大学生程序设计竞赛)的在线评测系统。题目编号1002,通常表示该题是ZOJ平台上的一个问题,可能涉及算法...

    FR1002人脸识别模块结合stm32实现3D红外人脸识别,并配合超声波模块触发人脸识别

    FR1002人脸识别模块结合stm32实现3D红外人脸识别,并配合超声波模块触发人脸识别。FR1002人脸识别模组解决方案以高性能应用处理器为硬件平台,配合双目传感器进行活体检测,具有启动速度快、金融级的识别能力、超低...

    TDS 1002示波器说明书

    《TDS 1002示波器说明书》是一份详细指导文档,它为用户提供如何使用TDS1000和TDS2000系列数字存储示波器的操作知识。这份说明书涵盖了从产品介绍、保修概要到具体使用方法的方方面面,让用户能够充分了解和发挥示波...

    EQ1002-LED显示屏控制软件-单色

    《EQ1002单色LED显示屏控制软件详解》 LED显示屏作为一种广泛应用的现代显示技术,广泛用于广告、信息传播、舞台背景等多个领域。而控制软件则是LED显示屏正常运行的关键,它负责对屏幕进行编程、编辑和管理。本文...

    RP-1002E使用说明书

    RP-1002E是NOTIFIER公司的一款气体灭火控制器,这款设备主要用于自动监测和控制保护区域内的火灾情况,确保在火源初起时能够及时、准确地启动气体灭火系统。用户手册是操作和维护此类设备的重要参考资料,下面将详细...

    C:\Users\Administrator\Desktop\诺蒂菲尔设备资料RP-1002E气控盘使用手册.pdf

    从提供的文件信息来看,这份文档是关于诺蒂菲尔公司(Notifier)的RP-1002E气控盘的使用手册。根据文件中的标签和部分内容,我们可以了解到该设备的一些基本信息,比如制造商的联系方式和网站地址。 根据文件内容,...

    ch1002-95测绘产品检查验收规定.pdf

    《ch1002-95测绘产品检查验收规定》是中华人民共和国测绘行业的一个重要标准,旨在规范测绘产品的质量检查和验收流程,确保测绘产品符合国家标准和行业标准,保障测绘成果的准确性和可靠性。该标准详细规定了测绘...

    ASTM C1002.pdf

    ASTM C1002.pdf ASTM C1002.pdf 是一种关于钢自穿螺钉的标准规范,用于将石膏板产品或金属粉刷基座连接到木 studs 或钢 studs 上。 知识点1:钢自穿螺钉的应用 ASTM C1002.pdf 规定了钢自穿螺钉的应用场景,包括...

    ACM杭电1002 C++程序

    标题 "ACM杭电1002 C++程序" 指向的是一个与ACM国际大学生程序设计竞赛相关的题目,具体是杭州电子科技大学(Hangzhou Dianzi University)在线评测系统上的第1002号问题。这个问题要求用C++编程语言来解决大数相加...

    hive_jdbc_2.6.2.1002.zip

    Hive JDBC 2.6.2.1002 是一个关键组件,它在大数据处理领域扮演着重要的角色。Hive 是由 Apache 软件基金会开发的一个数据仓库工具,它允许用户使用类 SQL 查询语言(HQL)来处理存储在分布式文件系统中的大规模数据...

    SPHE1002 eCos系统BMP图片设计向导

    ### SPHE1002 eCos系统BMP图片设计向导 #### SPHE1002 eCos系统调色板 在SPHE1002 eCos系统中,调色板是一个非常重要的概念,它决定了BMP图片的颜色配置。调色板包含了一系列预定义的颜色值,这些颜色值用于构建...

    杭电ACM1002解题答案

    ### 杭电ACM1002解题分析与代码详解 #### 题目背景与解析 根据题目描述及代码内容,我们可以推断出这是一道关于大数加法处理的问题。通常情况下,整数的加法可以直接通过内置类型(如`int`或`long long`)来实现,...

    TDS1002B系列示波器使用说明书.rar

    《TDS1002B系列示波器使用说明书》是一个详细介绍如何操作和利用泰克(Tektronix)公司生产的TDS1002B系列示波器的指南。示波器是电子工程师、技术人员和科研人员在检测、调试电子设备时不可或缺的工具,它能显示信号...

    HMC10021,HMC1002中文数据手册

    ### HMC10021/HMC1002中文数据手册详解 #### 一、产品概述 HMC10021与HMC1002是两款高性能磁传感器,专为一轴和二轴磁场检测而设计。这两款传感器能够提供高灵敏度、可靠性和成本效益,适用于多种应用领域,包括...

    hdoj1002——大整数相加

    ### hdoj1002——大整数相加 #### 题目背景与目的 本题目来源于杭州电子科技大学的在线评测系统(HDOJ),编号为1002的大整数相加问题。该题目主要考察的是编程者对于大整数处理的基本技巧以及对数组、循环等基础...

    ClouderaHiveJDBC41-2.6.2.1002.zip

    标题中的"ClouderaHiveJDBC41-2.6.2.1002.zip"指的是Cloudera发行的Hive JDBC驱动程序的压缩包文件,版本号为2.6.2.1002。这个驱动是用于Java应用程序与Hive数据仓库进行交互的桥梁,它实现了Java Database ...

    飞鱼1002型矢双面算尺说明书.docx

    1002型矢双面计算尺 用法说明书 上海计算尺厂 上海南昌路528号 1002型双面计算尺用法说明书

    UralACM1002(c++)

    【标题】"UralACM1002(c++)"是一个与编程竞赛相关的主题,尤其在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)的范畴内。Ural ACM通常指的是乌拉尔大学(University of Ural)举办...

Global site tag (gtag.js) - Google Analytics