PAT乙级:1014 福尔摩斯的约会 (20 分)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 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。
题解思路:
此题主要为3部分,星期、时 、 分 。
星期从第一二行字符串中的第一个相同的大写字母【A-G】获得;
时从第一二行字符串中的第二个相同的【0-9或A-N】获得;
分从第三四行字符串中的第一个相同的字符【A-Z或a-z】获得;
在获取时时是在已经获取了星期的前提下完成的
提交代码:
import java.util.Scanner;
/**
* 1014 福尔摩斯的约会 (20 分)
*
* @author LiFeilin
* @date 2021/5/29 22:11
*/
public class Test14 {
public static void main(String[] args) {
//从键盘读取四行字符串,存储到array[]字符数组中
Scanner scanner = new Scanner(System.in);
String[] array = new String[4]; //开辟数组空间存储字符串
for (int i = 0; i < 4; i++) {
array[i] = scanner.nextLine();
}
String[] week = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; //星期数组
boolean day = false;//用来标记第一组字符是否找到
char ch1 = 0, ch2 = 0;
for (int i = 0; (i < array[0].length()) && (i < array[1].length()); i++) { //在前两行字符串中找
ch1 = array[0].charAt(i); //ch保存第一行字符串中第i个位置的字符
if (!day && (ch1 >= 'A' && ch1 <= 'G'))// 星期只有7天,所以A-G,题目中的D是第四个字母,所以是A-G
{
if (array[0].charAt(i) == array[1].charAt(i)) { // 找到第一对相同的大写字母
day = true;// 更改标志,表示找到星期
System.out.print(week[ch1 - 'A'] + " "); //输出星期
continue;// 继续找第二对相同的字母
}
}
if (day) { //找时
if ((ch1 >= '0' && ch1 <= '9') || (ch1 >= 'A' && ch1 <= 'N')) {// 24小时的表示:0-9,A-N
if (array[0].charAt(i) == array[1].charAt(i)) {
if (ch1 >= '0' && ch1 <= '9')
System.out.printf("%02d:", ch1 - '0'); //输出时
else
System.out.printf("%02d:", ch1 - 'A' + 10); //输出时
break;//避免后面还有相同的字符
}
}
}
}
for (int i = 0; (i < array[2].length()) && (i < array[3].length()); i++) {// 遍历第三四行字符串
if (array[2].charAt(i) == array[3].charAt(i)) {
ch2 = array[2].charAt(i);
if ((ch2 >= 'A' && ch2 <= 'Z') || (ch2 >= 'a' && ch2 <= 'z')) {// 题目要求是相同的字母,所以包含大小写
System.out.printf("%02d", i); //输出分
break;
}
}
}
}
}