题目描述
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 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
package pat;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class patSecondary04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str1 = sc.nextLine().trim();
String str2 = sc.nextLine().trim();
String str3 = sc.nextLine().trim();
String str4 = sc.nextLine().trim();
solution(str1, str2, str3, str4);
}
sc.close();
}
private static void solution(String str1, String str2, String str3, String str4) {
String tempStr1 = str1.length() < str2.length() ? str1 : str2;
String tempStr2 = str1.length() > str2.length() ? str1 : str2;
int i = 0;
List<Object> list = new ArrayList<>();
while (i < tempStr1.length()) {
if (tempStr1.charAt(i) == tempStr2.charAt(i)) {
if (tempStr1.charAt(i) >= 'A' && tempStr1.charAt(i) <= 'Z') {
list.add(tempStr1.charAt(i));
}
}
i++;
continue;
}
String tempStr3 = str3.length() < str4.length() ? str3 : str4;
String tempStr4 = str3.length() > str4.length() ? str3 : str4;
int j = 0;
while (j < tempStr3.length()) {
if (tempStr3.charAt(j) == tempStr4.charAt(j)) {
char chr = tempStr3.charAt(j);
if ((chr >= 'A' && chr <= 'Z') || (chr >= 'a' && chr <= 'z')) {
list.add(j);
}
}
j++;
}
char day = (char) list.get(0);
switch (day) {
case 'A':
System.out.print("MON" + " ");
break;
case 'B':
System.out.print("TUE" + " ");
break;
case 'C':
System.out.print("WED" + " ");
break;
case 'D':
System.out.print("THU" + " ");
break;
case 'E':
System.out.print("FRI" + " ");
break;
case 'F':
System.out.print("SAT" + " ");
break;
case 'G':
System.out.print("SUN" + " ");
break;
}
char hour = (Character) list.get(1);
if (hour >= '0' && hour <= '9') {
System.out.print("0" + String.valueOf(hour));
} else if (hour >= 'A' && hour <= 'Z') {
System.out.print(10 + ((int) hour - 'A'));
} else {
System.out.print(10 + ((int) hour - 'a'));
}
System.out.print(":");
int min = (int) list.get(2);
if (min < 10) {
System.out.print("0" + String.valueOf(min));
} else {
System.out.print(min);
}
}
}
我的结果
问题:
在线提交后,结果显示异常,提示整型无法转换到字符型。
所以,我在网站寻找相关的解释,发现存在如下转换路线:
也就是说,对于Java中的对象类型,如果它们在继承层次结构的同一分支中,则它们可以相互转换。根据图中的分支结构,这意味着处于不同的分支中的类型,不能相互转换。所以Integert可以强制转换为Number,反之亦然,每个object都可以强制转换为Object。但Integer不能转换为Character。具体链接地址为https://www.quora.com/Why-do-I-keep-getting-a-java-lang-Integer-cannot-be-cast-to-java-lang-Character
我的解决方案
将list的数据类型改为了字符串,然后再进行数据类型的转换。
令人比较沮丧的是,再次提交后,又出现了错误信息:
what is wrong?
经过冷静思考之后,突然想到了用try...catch捕获异常,果然在一个输入样例时发现了异常:
所以,在处理第三个时间节点的时候出现了异常,但是通过debug程序发现,是由于在处理前两条字符串匹配的时候多添加了一个字符,导致了后面的处理不知所措。
所以,补充添加了判断list中元素个数的判断
经过对两处三元表达式的替换,最终全部通过测试用例!
代码如下:
package pat;
import javax.swing.*;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class patSecondary04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
while (sc.hasNext()) {
String str1 = sc.nextLine().trim();
String str2 = sc.nextLine().trim();
String str3 = sc.nextLine().trim();
String str4 = sc.nextLine().trim();
solution(str1, str2, str3, str4);
}
} catch (NumberFormatException e) {
System.out.print(e);
}
sc.close();
}
private static void solution(String str1, String str2, String str3, String str4) {
String tempStr1 = null;
String tempStr2 = null;
if (str1.length()<=str2.length()){
tempStr1 = str1;
tempStr2 = str2;
}else{
tempStr1 = str2;
tempStr2 = str1;
}
List<String> list = new ArrayList<>();
boolean flag = false;
try {
for (int i = 0; i < tempStr1.length(); i++) {
if (tempStr1.charAt(i) == tempStr2.charAt(i)) {
char chr = tempStr1.charAt(i);
if (chr >= 'A' && chr <= 'Z') {
list.add(String.valueOf(chr));
if (list.size()==2){
break;
}else {
flag = true;
continue;
}
}
if (flag == true) {
if (chr >= 'A' && chr <= 'N') {
list.add(String.valueOf(chr));
break;
} else if (chr >= 'a' && chr <= 'n') {
list.add(String.valueOf(chr));
break;
} else if (chr >= '0' && chr <= '9') {
list.add(String.valueOf(chr));
break;
} else {
continue;
}
}
}
}
} catch (Exception e) {
System.out.println(e);
}
String tempStr3 = null;
String tempStr4 = null;
if (str3.length()<=str3.length()){
tempStr3 = str3;
tempStr4 = str4;
}else{
tempStr3 = str4;
tempStr4 = str3;
}
for (int j = 0; j < tempStr3.length(); j++) {
if (tempStr3.charAt(j) == tempStr4.charAt(j)) {
char chr = tempStr3.charAt(j);
if ((chr >= 'A' && chr <= 'Z') || (chr >= 'a' && chr <= 'z')) {
list.add(String.valueOf(j));
break;
}
}
}
String day = list.get(0);
switch (day) {
case "A":
System.out.print("MON" + " ");
break;
case "B":
System.out.print("TUE" + " ");
break;
case "C":
System.out.print("WED" + " ");
break;
case "D":
System.out.print("THU" + " ");
break;
case "E":
System.out.print("FRI" + " ");
break;
case "F":
System.out.print("SAT" + " ");
break;
case "G":
System.out.print("SUN" + " ");
break;
}
String hor = list.get(1);
char hour = (char) hor.charAt(0);
try {
if (hour >= '0' && hour <= '9') {
System.out.print("0" + String.valueOf(hour));
} else if (hour >= 'A' && hour <= 'N') {
System.out.print(10 + (int) (hour - 'A'));
} else if (hour >= 'a' && hour <= 'n') {
System.out.print(10 + (int) (hour - 'a'));
}
} catch (Exception e) {
System.out.println(e);
}
System.out.print(":");
String num = (String) list.get(2);
int min = Integer.parseInt(num);
try {
if (min < 10) {
System.out.print("0" + String.valueOf(min));
} else {
System.out.print(min);
}
} catch (Exception e) {
System.out.println(e);
}
}
}
虽然写的比较low,处理过程还有待优化,继续加油!