乙级PAT真题1014

1014 福尔摩斯的约会 (20分)

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

我们首先来分析下题意,可以得到以下条件

  1. 前面一对字符串中的第一对大写字母,代表Day,范围是在A~G
  2. 前面一对字符串中的第二对大写字母,代表的是小时.范围是在0~9,
    A~N
  3. 后面一对字符串的第一对小写字母的位置,是从零开始,代表的是分钟,位置代表的就是第几分钟
  4. 然后,我们要注意,一对一定要位置相同

我们条件分析完了,接下来直接看代码

import java.io.BufferedReader;
        import java.io.InputStreamReader;

public class C_14_2 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String A = br.readLine();
        String B = br.readLine();
        String C = br.readLine();
        String D = br.readLine();
        String[] Week = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
        int second = 0;
        int Third = 0;
        int Minute = 0;
        //求星期
        for (int i = 0; i < A.length() && i < B.length(); i++) {
            if (A.charAt(i) >= 'A' && A.charAt(i) <= 'G')
                if (B.charAt(i) == A.charAt(i)) {
                    System.out.print(Week[A.charAt(i) - 65] + " ");
                    second = i + 1;
                    break;
                }
            if (second != 0)
                break;
        }

        //求小时
        for (int i = second; i < A.length() && i < B.length(); i++) {
            if (A.charAt(i) >= '0' && A.charAt(i) <= '9') {
                if (B.charAt(i) == A.charAt(i)) {
                    System.out.printf("0" + A.charAt(i) + ":");
                    Third = 1;
                    break;
                }
            } else if (A.charAt(i) >= 'A' && A.charAt(i) <= 'N')
                if (B.charAt(i) == A.charAt(i))
                    if (B.charAt(i) >= 'A' && B.charAt(i) <= 'N') {
                        System.out.print((int) A.charAt(i) - 55 + ":");//直接强制类型转换,算出来的就是小时
                        Third = 1;
                        break;
                    }
            if (Third != 0)
                break;
        }

        //求分钟
        for (int i = 0; i < C.length() && i < D.length(); i++) {
            if ((C.charAt(i) >= 'A' && C.charAt(i) <= 'Z') || (C.charAt(i) >= 'a' && C.charAt(i) <= 'z'))
                if (C.charAt(i) == D.charAt(i))
                    if ((D.charAt(i) >= 'A' && D.charAt(i) <= 'Z') || (D.charAt(i) >= 'a' && D.charAt(i) <= 'z')) {
                        System.out.print(i > 10 ? i : "0" + i);
                        Minute = 1;
                        break;
                    }
            if (Minute != 0)
                break;
        }
    }
}

具体的可以详细看下我代码,这边用的比较多的是ASCII码值,通过ASCII码值,能很快的把时间转换出来,这题我做的时候一直没有注意,一对字母的位置得是一样的,我一直忽略了这一点,真的是大意了,希望大家不要犯和我一样的错啊

最后,这里是新学编程的三岁,大佬们如果有更方便的方法,希望能在评论区告诉我,我会加以改正,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值