1061 Dating (20分)
此题与PAT乙级的 1014 福尔摩斯的约会 一样,只是以中文表述罢了,看不懂英文题的直接点题目超链接即可。
题意分析:
所有关键信息都是在两行对应位置相同字符(common )中取得的,所以第1,2行和3,4行分别同步遍历,第一步先判断字符是否相同,才进行下一步判断。
一共有3个关键信息:
- 周几:第1,2行的首个相同的大写字母"A~G"代表周一 ~ 周日;
- 几点钟:在1,2行,必须出现在判断周几的"A~G"之后!出现相同的"0~9"代表0~9点钟或"A~N"(大写)代表10~23点钟。
- 几分钟:在3,4行,首个相同的字母(大小写均可)的下标(0~59)即为分钟。
C语言代码(含详细注释和坑点提示)
#include<stdio.h>
char Week[][4] = { "MON","TUE","WED","THU","FRI","SAT","SUN" }; //★坑点★ 请检查有无写错!(尽量用复制粘贴不要自己敲)
#define MAX_LEN 61 // 4 non-empty strings of no more than 60 characters without white space 。要+1空间存'\0'。
char buf0[MAX_LEN], buf1[MAX_LEN];
int main() {
int w = -1, h; //w=0~6 表示周一~周日 ; h小时
gets(buf0); gets(buf1); //C语言的此法不安全,若用C++可以 cin.getline(buf0,MAX_LEN); 代替。
for (int i = 0; buf0[i] &&buf1[i]; ++i) { //直到其中一个结尾
if (buf0[i] == buf1[i]) { //首先对应位字符必须相同,然后buf0,buf1仅需判断其中一个。
if (-1 == w) { //★坑点★ 要先判断是周几,只需以w作flag。不能与下面判断 为字母A~G合并!
if('A'<=buf0[i] && buf0[i]<='G') { //若可以是全部大写字母,可用isupper()代替
w = buf0[i] - 'A'; //Week['A'-'A']="MON" 所以是减'A'
}
} //否则已经取得周几,开始判断几点钟。
else if(isdigit(buf0[i])) { //是数字0~9
h = buf0[i] - '0';
break; //★坑点★ 不跳出会被第3个,4个,……所覆盖!(测试点2会错误)
}
else if('A'<=buf0[i] && buf0[i]<='N') {
h = buf0[i] - ('A' - 10); //★坑点★ 'A'算做h=10! 也可写作 h = buf0[i] - 'A' + 10;
break; //★坑点★ 不跳出会被第3个,4个,……所覆盖!(测试点2会错误)
}
}
}
//if(w<0 || w>6 || h<0 || h>23)return -1; //【合法输入不会执行此语句】可以检测自己的求w和h是否越界。
gets(buf0); gets(buf1); //第3,4行(可以覆盖,重复利用)
for (int i = 0; buf0[i] &&buf1[i]; ++i) { //i分钟
if (buf0[i] == buf1[i] && isalpha(buf0[i])) { //是相同字母(大小写皆可)
printf("%s %02d:%02d\n", Week[w], h, i); //★坑点★ 要注意HH:MM格式,个位数以0开头凑够2位。
return 0; //★坑点★ 只算第一个!及时跳出(也可用 break; 下面要改返回0)
}
}
return -1; //【合法输入不会执行此语句】
}
若要在C++中执行,需将gets(...)部分改为如下:
#include<cstdio>
#include<iostream>
//↑加在开头
//↓代替所有 gets(...) 的行
std::cin.getline(buf0, MAX_LEN); std::cin.getline(buf1, MAX_LEN);
此题不需要特别的STL库,反而C语言更简洁。C++的坑点也是一样的,可以通用。
我第一次做是用Python3 的,代码精简凝练!但是不熟练Python不建议用,不会zip,filter则丧失优势。
Week=('MON','TUE','WED','THU','FRI','SAT','SUN')
w,h=-1,-1
for e in filter(lambda e:e[0]==e[1],zip(input(),input())):
if -1==w:
if 'A'<=e[0]<='G':
w = ord(e[0])-ord('A')
elif e[0].isdecimal():
h=ord(e[0])-ord('0') ;break
elif 'A'<=e[0]<='N':
h=ord(e[0])-ord('A')+10 ;break
for i,e in enumerate(zip(input(),input())):
if e[0]==e[1] and e[0].isalpha():
print("%s %02d:%02d" % (Week[w], h, i))
exit(0)
注意是 Python3 !

本文解析了PAT乙级1061 Dating题目的解题思路,介绍了如何通过对比字符串找出约会的星期、时间等关键信息,并提供了详细的C语言代码实现及注意事项。
199

被折叠的 条评论
为什么被折叠?



