PAT 乙级 1014.福尔摩斯的约会 C++/Java
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
分析:
对于第一个和第二个字符串:
第一对相同的字母(A-G):代表星期几
第二对相同的/数字(0-9 / A - N):代表小时,A代表10,所以是第10个钟头
对于第三个和第四个字符串:
第一对相同的字母(a-z / A-Z):他们出现的位置代表分钟
注意输出格式:小时和分钟,如果不足2位数的话要补0。
#include <iostream> using namespace std; int main() { string s1, s2, s3, s4; cin >> s1 >> s2 >> s3 >> s4; string day[7] = { "MON","TUE","WED","THU","FRI","SAT","SUN" }; bool flag = true; for (int i = 0; i < s1.length(); i++) { if (flag && s1[i] == s2[i] && s1[i] >= 'A' && s1[i] <= 'G') { cout << day[s1[i] - 'A'] << " "; flag = false; } else if(!flag && s1[i] == s2[i]) { if (s1[i] >= 'A' && s1[i] <= 'N') { int temp = s1[i] - 'A' + 10; cout << temp << ":"; break; } else if (s1[i] >= '0' && s1[i] <= '9') { cout << "0" << s1[i] << ":"; break; } } } for (int i = 0; i < s3.length(); i++) { if (s3[i] == s4[i]) { if ((s3[i] >= 'a' && s3[i] <= 'z') || (s3[i] >= 'A' && s3[i] <= 'Z')) { if (i < 10) { cout << "0" << i; } else { cout << i; } break; } } } }
Java实现:
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner input = new Scanner(System.in); 6 String[] s = new String[4]; 7 String[] week = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; 8 for (int i = 0; i < 4; i++) { 9 s[i] = input.next(); 10 } 11 input.close(); 12 //星期 13 int len = s[0].length(); 14 int i = 0; 15 char a; 16 for (i = 0; i < len; i++) { 17 a = s[0].charAt(i); 18 if(a == s[1].charAt(i)){ 19 if( a >= 'A' && a <= 'G'){ 20 System.out.print(week[a - 'A'] + " "); 21 break; 22 } 23 } 24 } 25 //时 26 for(i = i + 1; i < len; i++){ 27 a = s[0].charAt(i); 28 if(a == s[1].charAt(i)){ 29 if(Character.isDigit(a)){ //Character.isDigit():只接受字符,若字符为数字,返回true;否则返回false 30 System.out.printf("%02d:", a - '0'); 31 break; 32 }else if( a >= 'A' && a <= 'N'){ 33 System.out.printf("%02d:", a - 'A' + 10); 34 break; 35 } 36 } 37 } 38 //分 39 len = s[2].length(); 40 for (i = 0; i < len; i++) { 41 a = s[2].charAt(i); 42 if(a == s[3].charAt(i)){ 43 if(a >= 'A' && a <= 'Z' || a >= 'a' && a <= 'z'){ 44 System.out.printf("%02d\n", i); 45 break; 46 } 47 } 48 } 49 } 50 }