写在最前:欢迎批评,欢迎任意地方的指正,用你们的优秀的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])));
}
}