PAT 乙级 1014 福尔摩斯的约会 Java解决

写在最前:欢迎批评,欢迎任意地方的指正,用你们的优秀的java代码砸死我吧!!

问题——————

大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示);后面两字符串第 1 对相同的英文字母 s 出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。

输入格式:

输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。

输出格式:

在一行中输出约会的时间,格式为 DAY HH:MM,其中 DAY 是某星期的 3 字符缩写,即 MON 表示星期一,TUE 表示星期二,WED 表示星期三,THU 表示星期四,FRI 表示星期五,SAT 表示星期六,SUN 表示星期日。题目输入保证每个测试存在唯一解。

输入样例:

3485djDkxh4hhGE 
2984akDfkkkkggEdsb 
s&hgsfdk 
d&Hyscvnm

输出样例:

THU 14:04

解题思路:

读题很重要,这道题需要仔细地读两三遍题才能下手 ,起初看到这个题觉得算是一个比较简单的题,只要把读入的字符串变成字符数组挨个比较就可以,但是实际提交后发现有不少小坑,并且还极难排查,这也是这么一道20分得题只有0.16的提交通过率的原因(全部95道最低)。他每一句话都有隐含的限定条件,第一次并不溶于读出来,比如我第一次读题的想法:第一对相同的大写英文字母,这里明显看到限制是大写英文字母,于是比对的时候就只加了大写英文字母的限定,第二个是第二对相同的字符,于是乎没有加什么限定,觉得他任意字符就可以,然后就是相同的英文字母,也没有加更多的限制;读到这里,后面又看到保证每个测试存在唯一解,就更不加多想,直接下手写第一次写完只有一两个检查点通过吧(记不太清了),于是开始改,逐渐发现了这些坑:比如两个字符相同的前提是这两个字符是有效字符串,什么是有效字符串呢?第一个表示星期,所以只有第一组相等的ABCDEFG才算是有效的,如果他给出的字符串的第一组相等的不是这骑个字母,那么直接后延,这里如果直接读取第一个相等的字符一定会出错,第二个字符也是,需要在"0123456789ABCDEFGHIJKLMN"中的任意字符才可以,并且不能是小写,这些条件都是题中隐含的条件,没有看出来只能怪自己读题不仔细。最后要注意的小点就是时间输出的时候注意用HH:MM的格式输出,补零很重要。如果以上的小坑都注意到的话就没有什么能挡住你的了,直接按照题目添加限定条件来计算就好了。

package not.die.in.here;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class _1014_HolmesDate {

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		char[] a = bf.readLine().toCharArray();//存放四个字符串,读取的时候就转化为字符数组存储
		char[] b = bf.readLine().toCharArray();
		char[] c = bf.readLine().toCharArray();
		char[] d = bf.readLine().toCharArray();
		StringBuilder sb = new StringBuilder("");//存放结果的变量
		String hour = "0123456789ABCDEFGHIJKLMN";//小时的字符
		int count = 0;//计数
		for(int i = 0;i<(a.length<b.length?a.length:b.length);i++) {
			if(count==0) {//第一个
				if(a[i]>='A' && a[i]<='G' &&a[i]==b[i]) {//符合A到G并且相等
					sb.append(a[i]+ " ");
					count++;
				}
			}else
			if(count == 1) {//第二个
				if(hour.indexOf(a[i])!=-1&&a[i]==b[i]) {//符合有效字符并且相等
					sb.append(a[i]+" ");
					break;
				}
			}
		}
		for(int i = 0;i<(c.length<d.length?c.length:d.length);i++) {//循环两个字符串,循环次数为较小的数组长度
			if(((c[i]>64 && c[i]<91)||(c[i]>96 && c[i]<123))&&c[i]==d[i]) {//是字母并且相等
					sb.append(i);
					break;
			}
		}
		Map<String,String> week = new HashMap<String,String>();//存放周的map
		week.put("A", "MON ");
		week.put("B", "TUE ");
		week.put("C", "WED ");
		week.put("D", "THU ");
		week.put("E", "FRI ");
		week.put("F", "SAT ");
		week.put("G", "SUN ");
		
		String[] buf = sb.toString().split(" ");
		System.out.println(week.get(buf[0])//根据答案输出周几
							+String.format("%02d", hour.indexOf(buf[1]))+":"//格式化输出时间
							+String.format("%02d", Integer.parseInt(buf[2])));
	}
}

 

提交截图:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值