题目描述

大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 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


这边注意几点,如果前两个输入中出现连续相同的字母怎么办?如果代表小时的相同字母/数字出现得比代表日期的相同字母要早怎么办?如果后两个输入中有多组相同的字母怎么办?输出中碰到个位数的小时/分钟时前面不带”0”(输出不规范)怎么办?

这些都不是问题,下面贴出通过的代码,并且有详细注释。可能会显得有些冗长,但是看起来一目了然,毫无难度。

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import java.util.Scanner;

public class Holmes {
//定义日期
private static char[] day = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
//定义当天的小时
private static char[] hour ={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N'};

public static void main(String[] args){

//循环读取四个输入
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
//获取四个字符串
String str1 = scanner.nextLine();
String str2 = scanner.nextLine();
String str3 = scanner.nextLine();
String str4 = scanner.nextLine();

//判断前两个字符串哪一个最短
int daytime = shortest(str1, str2);
boolean isDay = true;//判断相同的字母是否是代表“天”
String result = "";//结果字符串
int sum = 0; //前两个字符串中相同字母/数字的个数

for (int i = 0; i < daytime; i++){
if (str1.toCharArray()[i] == str2.toCharArray()[i] && isInDay(str1.toCharArray()[i]) && isDay){
result += getDay(str1.toCharArray()[i]);
/**
* isDay有两个作用:
* 一是防止下一次有字母出现时将字母当作成“天”的字母;
* 二是供else if 中做判断,防止识别时间在识别周几之前
*/
isDay = false;
sum++;
}else if (str1.toCharArray()[i] == str2.toCharArray()[i] && isInHour(str1.toCharArray()[i]) && !isDay ){
//输出规范化,防止出现输出为 “THU 2:12”的情况
if (getHour(str1.toCharArray()[i]) < 10){
result += " 0"+ getHour(str1.toCharArray()[i]);
sum++;
}else {
result += " "+ getHour(str1.toCharArray()[i]);
sum++;
}
}
//防止已经识别周几和小时之后还有相同又符合判断条件的字母出现
if (sum == 2)
break;
}

//获取str3,str4中最小的字符串长度
int minute = shortest(str3, str4);
for (int i = 0; i < minute ; i++){
if (str3.toCharArray()[i] == str4.toCharArray()[i] && isEnglishChar(str3.toCharArray()[i])){
//输出规范化,与上同
if (i < 10 ) {
result += ":0" + i;
break; //有相同的字母直接退出for循环
}else {
result += ":" + i;
break;
}
}
}
//输出
System.out.println(result);
}
}

/**
* 返回两个字符串长度最小的字符串长度
* @param str1
* @param str2
* @return
*/
public static int shortest(String str1, String str2){
return str1.length() < str2.length() ? str1.length() : str2.length();
}

/***
* 判断输入字符是否存在与day的数组中
* @param character
* @return
*/
public static boolean isInDay(Character character){
for (int i = 0; i < day.length; i++){
if (character == day[i])
return true;
}
return false;
}

/**
* 判断输入字符是否存在与hour数组中
* @param character
* @return
*/
public static boolean isInHour(Character character){
for (int i = 0; i < hour.length; i++){
if (character == hour[i])
return true;
}
return false;
}

/**
* 根据输入字符获取星期几的简写
* @param dayChar
* @return
*/
public static String getDay(Character dayChar){
switch (dayChar){
case 'A':
return "MON";
case 'B':
return "TUE";
case 'C':
return "WED";
case 'D':
return "THU";
case 'E':
return "FRI";
case 'F':
return "SAT";
case 'G':
return "SUN";
}
return "Not Found This Day";
}

/**
* 根据输入字符获取小时时间
* @param hourChar
* @return
*/
public static int getHour(Character hourChar){
for (int i = 0; i < hour.length; i++){
if (hourChar == hour[i])
return i;
}
return -1;
}

/**
* 判断输入字符是否是一个英文字母(包含大小写)
* @param engChar
* @return
*/
public static boolean isEnglishChar(Character engChar){
if (engChar >= 'a' && engChar <= 'z')
return true;
else if(engChar >= 'A' && engChar <= 'Z')
return true;
else
return false;
}
}