福尔摩斯的约会

题目描述

大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 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,处理过程还有待优化,继续加油!

猜你喜欢

转载自blog.csdn.net/arpospf/article/details/81142187