poj 1002 487-3279

来源:互联网 发布:seo基础入门 编辑:程序博客网 时间:2024/05/16 08:53

题目描述:

企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打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,如果不存在的话,就将其的频率设为1Integer 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
原创粉丝点击