POJ 1002 487-3279

这个题是按要求输出电话号码,开始很快写了一版出来,用给的测试案例测试没问题,但是提交一直提示Wrong Answer,从网上看到有人用如下测试案例

2

0000-00-0

00-0-0-0-0-0

顿时意识到我的电话号码都是当作int来处理的,这样两端的0都不见了。其实,问题的起因是我之前只知道有个Arrays.sort(int[] temp),而不知道还有个Arrays.sort(char[] temp)。为了使用Arrays.sort(int[] temp),我将中间结果都先转换成int,然后调用来排序,然后再一个数字一个数字的计算之后取出来再打印。这个时候没有Wrong Answer了,但是这种方式添加了很多额外的处理,提交一直是Runtime Error,估计是消耗时间太长了,没办法,将代码分为几段,逐段进行优化。

最后发现有Arrays.sort(char[] temp)可以用,不再需要先转化为int[]来排序,而且排序完之后也不需要一个数字一个数字的取出来打印,可以直接用subString()函数取。

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		// input
		Scanner scanner = new Scanner(System.in);
		int count = scanner.nextInt();

		String[] input = new String[count];
		for(int x=0; x<count; x++){
			input[x] = scanner.next();
		}

		// parse char to number
		input = parseChar(input);
		Arrays.sort(input);

		// print
		int number = 1;
		boolean isPrint = false;
		if(count == 2) {
			if(input[0].equals(input[1])) {
				System.out.println(input[0].substring(0, 3) + "-"
						+ input[0].substring(3, 7) + " " + 2);
				isPrint = true;
			}
		} else if(count > 2){
			for(int m=0; m<count-1; m++){
				if(input[m+1].equals(input[m])){
					number ++;

					if(m+2 == count){
						if(number > 1) {
							System.out.println(input[m].substring(0, 3) + "-"
									+ input[m].substring(3, 7) + " " + number);
							isPrint = true;
						}
					}
				} else {
					if(number > 1) {
						System.out.println(input[m].substring(0, 3) + "-"
								+ input[m].substring(3, 7) + " " + number);
						isPrint = true;
					}
					number = 1;
				}
			}
		}

		if(!isPrint) System.out.println("No duplicates.");

	}

	public static String[] parseChar(String[] input){
		int count = input.length;

		for (int i=0; i<count; i++){
			char[] val2 = new char[7];

			for(int j=0, m=0; j<input[i].length() && m<7; j++, m++){
				// switch...case and if...else has the same effect.
				switch(input[i].toCharArray()[j]) {
				case 'A':
				case 'B':
				case 'C': val2[m] = '2'; break;
				case 'D':
				case 'E':
				case 'F': val2[m] = '3'; break;
				case 'G':
				case 'H':
				case 'I': val2[m] = '4'; break;
				case 'J':
				case 'K':
				case 'L': val2[m] = '5'; break;
				case 'M':
				case 'N':
				case 'O': val2[m] = '6'; break;
				case 'P':
				case 'R':
				case 'S': val2[m] = '7'; break;
				case 'T':
				case 'U':
				case 'V': val2[m] = '8'; break;
				case 'W':
				case 'X':
				case 'Y': val2[m] = '9'; break;
				case '-': m--;           break;
				default: val2[m] = input[i].toCharArray()[j];
				}
			}
			input[i] = String.valueOf(val2);
		}
		return input;
	}
}

完成这道题花了2个晚上,不断调整不断优化代码,当然整个过程有很多思考,回过头来总结也有很多收获。

总结两点:

1、解题步骤:先构思,再编码实现。找数据测试,做到没有Wrong Answer错误。如果出现Runtime Error,那就将代码分为几段,分段进行优化。

2、熟悉常用函数。在使用某函数之前,需要先大致了解其相关的,采用最合适的,而不是找到一个可用就用起来了,最后发现走了很多弯路。这题因为Arrays.sort(char[] temp)不熟悉而走了很多弯路,POJ 1001也是同样的问题(不熟悉Scanner,BigDecimal的常用函数而走很多弯路)。

时间: 2024-10-12 11:41:01

POJ 1002 487-3279的相关文章

poj 1002:487-3279(水题,提高题 / hash)

487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 236746   Accepted: 41288 Description Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phras

[2016-01-19][POJ][1002]

[2016-01-19][ACM][POJ 1002] 题目大意:给定一串号码,转化号码,然后输出重复的号码.   方法:读取->转换->计数->输出   解题过程遇到问题:   cin,cout貌似会WA(原因不详) 数组开太小,wa成dog,开到50能过. 忘记输出,No duplicates.的情况 不知道 map 自带排序,手动实现了一遍,2333 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

字符串专题:map POJ 1002

第一次用到是在‘校内赛总结’扫地那道题里面,大同小异 map<string,int>str 可以专用做做字符串的匹配之类的处理 string donser; str [donser]++ 自动存donser到map并且值加一,如果发现重复元素不新建直接加一, map第一个参数是key,默认字典序升序排列key map<string,int>::iterator ii;         map的迭代器 for(ii=outputer.begin();ii!=outputer.end(

POJ 1002 487-3279 Trie题解

本题的解法是多种多样的,这里使用Trie来解决一下. 也可以使用hash表,map等解法,因为输入是特定的7位数字,故此应该都可以解决的. 这里使用Trie的速度并不快,主要是因为最后我直接遍历输出,遍历整个Trie的速度还是比较慢的. 思路: 1 使用insert函数建立Trie,主要增加一个叶子节点的信息,记录当前有多少个重复的字符串 2 遍历就是根据叶子节点的信息决定是否需要输出. #include <stdio.h> #include <iostream> #include

POJ 1002

1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 struct In{ 5 int a; 6 int num[10]; 7 }pu_1[100050]; 8 9 int cmp(const void*c,const void*d) 10 { 11 return (*(In *)c).a-(*(In *)d).a; 12 } 13 14 15 16 char str_1[100050][3

[POJ] #1002# Exponentiation : 大数乘法

一. 题目 Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 156373   Accepted: 38086 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of

POJ 1002 487-3279(快排)

AC 397MS 题意:中文题就不说了 思路:可以考虑记录下所有的数,然后排序,再一起统计就可以了!需要注意的是电话号码输出是有前导0的,还有字符串的数组该开大一点 AC代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=100000+10; char str[maxn]; int a[maxn]; int Map(char ch)

POJ 1002 题解

这个题目题意挺简单,就是给定一个字符串,按一定规则转化为给定格式的字符串.首先把字母转数字,再把数字相加成一个7位数,根据大小排序,对相同的数字计数,再控制输出每一位即可.易错点在于:字母转数字时很容易将Q和Z略过,但是数字相加的时候就容易忘记Q和Z的存在.在寻找相邻排列的相同数字时也要注意计数的方法. #include<iostream> #include<algorithm> #include<string> using namespace std; long a[

poj - 1002题解

题意:给定一个字符串,按一定格式处理后排序并输出 题解:转换成7位数字来处理即可,输出的时候注意格式. 1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 long a[100001]; 6 bool com(const int &x,const int&y) 7 { 8 return x<y; 9 } 10 int main(