每天一道算法_3_487-3279_对电话号码格式化统计批处理

早上弄了一道求高精度幂的算法,偷懒用了内部类,总觉得过意不去,所以今天重新做了一道算法题,做完心里舒服好多。题目如下: Description企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GI

大家好,又见面了,我是全栈君。

早上弄了一道求高精度幂的算法,偷懒用了内部类,总觉得过意不去,所以今天重新做了一道算法题,做完心里舒服好多。

题目如下:

Description

企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打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。  



如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)  



你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。  

Input

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

Output

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

No duplicates.  

Sample Input

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

Sample Output

487-3279 4
888-4567 3
310-1010 2
967-1111 1
310-4466 1
888-1200 1 

 

代码有点乱有点罗嗦,欢迎拍砖

代码:

import java.util.ArrayList;
import java.util.Scanner;

public class ThePhoneNum {
	
	public static void main(String args[]) {
		String[] tem = new String[8];//用来存储格式化之后的电话号码
		tem[3] = "-";//把电话号码第四位固定为'-'
		ArrayList<String> list = new ArrayList<String>();//记录输入的不规范号码
		ArrayList<String> memory = new ArrayList<String>();//用来记录格式化之后的所有号码
		Scanner scanner = new Scanner(System.in);
		int num = scanner.nextInt();
		int[] count = new int[num]; 		//统计相同号码的数量
		while ((num--) >= 0) {
			list.add(scanner.nextLine());
		}

		for (int i = 0; i < list.size(); i++) {
			String string = list.get(i);
			String[] temparray = string.split("-");//除去输入的号码中的所有"-"
			string = getStr(temparray);//把上行代码得到的字符串数组转化成字符串
			for (int j = 0; j < string.length(); j++) {
				String temString = string.substring(j, j + 1);
				if (j < 3) {
					if (isLetter(temString)) {	//是否为字母
						tem[j] = toNum(temString);//把字母映射成数字
					} else {
						tem[j] = string.substring(j, j + 1);//数字不用映射
					}
				} else {
					if (isLetter(temString)) {
						tem[j + 1] = toNum(temString);
					} else {
						tem[j + 1] = string.substring(j, j + 1);
					}
				}
			}
			if (tem[1] != null) {
				String s = getStr(tem);			//把经过转换后的号码加入到列表存储起来
				if(memory.contains(s)){
					count[memory.indexOf(s)]++;//如果已经存在,则直接数量上加1
				}else{
					memory.add(s);
				}
				
			}
		}
		for(String s : memory){
			System.out.println(s + " "+ (count[memory.indexOf(s)]+1));//遍历列表,输出号码
		}
	}

	private static String toNum(String temString) {
		// TODO Auto-generated method stub
		char c = temString.charAt(0);
		String s = String.valueOf(c);
		switch (c) {
		case 'a':case 'b':case 'c':case 'A':case 'B':case 'C':
			s = "2";
			break;
		case 'd':case 'e':case 'f':case 'D':case 'E':case 'F':
			s = "3";
			break;
		case 'g':case 'h':case 'i':case 'G':case 'H':case 'I':
			s = "4";
			break;
		case 'j':case 'k':case 'l':case 'J':case 'K':case 'L':
			s = "5";
			break;
		case 'm':case 'n':case 'o':case 'M':case 'N':case 'O':
			s = "6";
			break;
		case 'p':case 'r':case 's':case 'P':case 'R':case 'S':
			s = "7";
			break;
		case 'T':case 'U':case 'V':case 't':case 'u':case 'v':
			s = "8";
			break;
		case 'w':case 'x':case 'y':case 'W':case 'X':case 'Y':
			s = "9";
			break;
		}
		return s;
	}

	static boolean isLetter(String s) {
		char c = s.charAt(0);
		if (c >= 65 && c <= 122) {
			return true;
		} else {
			return false;
		}
	}
	public static String getStr(String[] args){
		String str="";
		for(int i=0;i<args.length;i++){	
			str+=(String)args[i];
		}	
		return str;
	}
}

 

 

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121388.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月10日 下午8:00
下一篇 2022年3月10日 下午8:00


相关推荐

  • Timer类中的 scheduleAtFixedRate与schedule

    Timer类中的 scheduleAtFixedRate与scheduleTimer 是 jdk 中提供的一个定时器工具 使用的时候会在主线程之外起一个单独的线程执行指定的计划任务 可以指定执行一次或者反复执行多次 定义了主要有以下 6 个方法 顾名思义 schedule 与 scheduleAtFi 的区别就是 是否按固定速率执行安排指定的任务 一般情况下 timer 的 schedule 和 scheduleAtFi 方法没有区别 只在某个情况出

    2026年3月17日
    1
  • 微软对ice服务器被炸的态度,我的世界ice服务器火了是因为被炸吗?「建议收藏」

    微软对ice服务器被炸的态度,我的世界ice服务器火了是因为被炸吗?「建议收藏」我的世界ice服务器被炸了这事情在2020年被炒的火热。本来服务器被炸是正常不过的事情了,但是不知道那个玩家在网上说什么ICE服务器价值好几万,炸服务器的玩家应该承担法律责任。而另一方面,炸服务器的凶手“Mn搜索阿喵”也自称服务器被炸之后它日子不好过。然而戏剧性的一幕发生了,3月29号,ICE服务器官方发表声明,说这一切都是造谣而已,所谓的ICE服务器价值没有好几万,服务器也才开了不到两个月。而…

    2022年5月1日
    85
  • 树莓派3b+串口配置

    树莓派3b+串口配置前言树莓派从大的方向来说一共出了3代,每一代的CPU外设基本相同,但内核不同,外设里面一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠,mini串口性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此mini串口有个致命的弱点是:波特率受到内核时钟的影响…

    2022年6月25日
    25
  • java字符串类型引用与字符类型引用的面试案例

    java字符串类型引用与字符类型引用的面试案例

    2021年7月16日
    63
  • 一台计算机如何安装2个版本的python,互不影响呢[通俗易懂]

    一台计算机如何安装2个版本的python,互不影响呢[通俗易懂]python学习过程中,很多教程都是python2版本的但是python2到2020年就不在维护了,所以现在教大家如何在一台计算机上安装python2和python3互不影响,可以自如的切换。不用任何第三方软件简单省力,一次配置就可。第一步下载适合自己电脑的安装包32还是64按照自己的电脑来:python2.7.13和python3.6先安装哪一个版本无所谓。不…

    2022年5月8日
    180
  • Android开发Service之BindService

    Android开发Service之BindService前言一直使用Qt来进行桌面端和移动端开发,对Android开发并不熟悉,但是项目中往往又经常会用到Android原生开发的东西。本次收集了一些关于BindService相关的知识供自己学习和参考。正文bindService介绍一、bindService简介bindService是绑定Service服务,执行service服务中的逻辑流程。service通过C…

    2022年6月5日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号