写点什么

[POJ 1002] 487-3279 C++ 解题报告

发布于: 2020 年 07 月 24 日
[POJ 1002] 487-3279 C++解题报告



Time Limit: 2000MSMemory Limit: 65536K

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

310-1010 2
487-3279 4
888-4567 3



解决思路

这是一道简单的模拟题,利用Java的TreeMap类和HashMap类可以快速解题。首先,我们可以把所有输入的号码转换成电话号码的标准格式,然后基于标准格式做统计(使用TreeMap,配合Comparator可以非常方便对key做排序。题目注意要记得处理无重复号码的情况。

package com.igeekspace;
import java.io.*;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
class MapKeyComparator implements Comparator<String> {
@Override
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
}
public class Main {
static BufferedReader bufferedReader;
static PrintWriter printWriter;
//字母到数字的映射关系
static HashMap<Character, String> letterNumberMap;
/**
* 获取某个电话号码的标准格式
*
* @param phoneNumber
* @return
*/
private static String getStandPhoneNumber(String phoneNumber) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < phoneNumber.length(); i++) {
char currentChar = phoneNumber.charAt(i);
if (Character.isLetter(currentChar)) {
stringBuilder.append(letterNumberMap.get(currentChar));
} else if (Character.isDigit(currentChar)) {
stringBuilder.append(currentChar);
}
}
stringBuilder.insert(3, '-');
return stringBuilder.toString();
}
/**
* 建立字母到数字的映射关系
*/
private static void init() {
letterNumberMap = new HashMap<Character, String>();
int count = 0;
int number = 2;
for (char i = 'A'; i < 'Z'; i++) {
if (i == 'Q') {
continue;
}
letterNumberMap.put(i, Integer.toString(number));
count++;
if (count % 3 == 0) {
number++;
}
}
}
private static void solve() throws IOException {
int numberCount = Integer.parseInt(bufferedReader.readLine());
TreeMap<String, Integer> phoneNumbers = new TreeMap<String, Integer>(new MapKeyComparator());
while (numberCount-- > 0) {
String phoneNumber = bufferedReader.readLine();
String standPhoneNumber = getStandPhoneNumber(phoneNumber);
if (phoneNumbers.containsKey(standPhoneNumber)) {
phoneNumbers.put(standPhoneNumber, phoneNumbers.get(standPhoneNumber) + 1);
} else {
phoneNumbers.put(standPhoneNumber, 1);
}
}
boolean isDuplicates = false;
for (Map.Entry<String, Integer> phoneNumber : phoneNumbers.entrySet()) {
if (phoneNumber.getValue() > 1) {
isDuplicates = true;
printWriter.println(phoneNumber.getKey() + " " + phoneNumber.getValue());
}
}
if (!isDuplicates) {
printWriter.println("No duplicates.");
}
}
public static void main(String[] args) throws IOException {
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
printWriter = new PrintWriter(new OutputStreamWriter(System.out));
init();
solve();
printWriter.flush();
}
}



发布于: 2020 年 07 月 24 日阅读数: 50
用户头像

我就是我,不一样的花火。 2020.07.19 加入

最近专注刷题。

评论

发布
暂无评论
[POJ 1002] 487-3279 C++解题报告