poj 1002 487-3279

题目描述:

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

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

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


分析:

题目中提到了映射,所以我们很容易的想到了hashmap,然后将我们的输入全部转化为数字再进行比较,这个样子会比较容易一些。

下面是代码,我们要注意的是超时问题:

import java.awt.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Set;

public class Main {

	public static void main(String[] args) {
		//初始化hashmap,将字母存储为键,将数字映射为对应的值
		HashMap<String, Integer> hash = new HashMap<String, Integer>();
		hash.put("A", 2);
		hash.put("B", 2);
		hash.put("C", 2);
		hash.put("D", 3);
		hash.put("E", 3);
		hash.put("F", 3);
		hash.put("G", 4);
		hash.put("H", 4);
		hash.put("I", 4);
		hash.put("J", 5);
		hash.put("K", 5);
		hash.put("L", 5);
		hash.put("M", 6);
		hash.put("N", 6);
		hash.put("O", 6);
		hash.put("P", 7);
		hash.put("R", 7);
		hash.put("S", 7);
		hash.put("T", 8);
		hash.put("U", 8);
		hash.put("V", 8);
		hash.put("W", 9);
		hash.put("X", 9);
		hash.put("Y", 9);
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		String[] telt = new String[n];
		LinkedList<String> strnum = new LinkedList<String>();
		HashMap<String, Integer> numhash = new HashMap<String, Integer>();//号码频率的哈希表
		for (int a = 0; a < n; a++) {
			telt[a] = scanner.next();
			String num = "";
			//将输入转化为数字
			for (int aa = 0; aa < telt[a].length(); aa++) {
				String c = String.valueOf(telt[a].charAt(aa));//遍历读出每个电话号码的字母

				if (hash.containsKey(c)) {//如果哈希表中有对应的键,将其映射的数字数出来
					num += String.valueOf(hash.get(c));
				} else if (c.equals("-")) {//如果是“-”的话,则不用输出
					num += "";
				} else {//如果是数字的话,就直接将数字输出
					num += c;
				}
			}
			//判断哈希表中是否已经存在这个值,如果存在的话,就将其的的频率增加1,如果不存在的话,就将其的频率设为1
			Integer i = numhash.get(num);
			if (i == null) {
				numhash.put(num, 1);
			} else {
				numhash.put(num, i + 1);
			}

		}
		Collection<String> keyset = numhash.keySet();
		java.util.List<String> list = new ArrayList<String>(keyset);
		Collections.sort(list);//将频率哈希表字典排序
		for (String key : list) {
			int resultnum = numhash.get(key);
			if (resultnum != 1) {//将频率不为1的号码输出
				System.out.println(key.substring(0, 3) + "-"
						+ key.substring(3, 7) + " " + resultnum);

			} else {//将频率为1的删除
				numhash.remove(key);
			}

		}
		if (numhash.isEmpty()) {//删除完成之后,如果哈希表是空的,说明里面没有重复的号码
			System.out.println("No duplicates.");
		}

	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值