【PAT】1014. 福尔摩斯的约会 (20)
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.前两个字符串包含星期和小时两个信息,首先,两个字符串在同一位置有相同的大写字母代表了星期的信息,且大写字母在A-G之间;
2.在表示星期的大写字母的后面,再找相同的字符(包含大写字母A-N,和数字0-9),,这个字符代表了小时的信息,例如:
YN6aBcmZD8oNp6 Yh6aBdmZg8lN
1)先找相同的大写字母,得到B,表示星期二,其中,第一个位置的Y虽然相同,但不在A-G之间,大写字母B之前的6和a也不满足);
2)再在B之后找相同的字符,得到8,表示08点,其中m虽然相同,但不是大写字母,大写字母Z不在A-N之间,在8后面的N虽然也满足条件,但已经确定了时间为08点,则N应该舍弃
注意在时间小于10(0-9)的时候,打印时间时前面需补0
3.在后两个字符串中确定了分钟的信息,需要找到相同的英文字母所在的位置(大写和小写字母均可),同样只取第一个满足条件的字符所在的位置,打印时不足两位的同样需要补0
程序说明:
1.确定需要比较的两个字符串中较短的字符串长度,再进行比较;
2.判断一个字符ch是不是大写字母的三种方法:
isupper(ch);//是大写字母返回非零值(true),否则返回零(false) if(ch>='A'&&ch<='Z'); if(ch>=65&&ch<=90);//65和90分别为A和Z对应的ASCII码值
3.判断一个字符ch是不是小写字母的三种方法:
islower(ch);//是小写字母返回非零值(true),否则返回零(false) if(ch>='a'&&ch<='z') if(ch>=97&&ch<=122)//97和122分别为a和z对应的ASCII码值
4.判断是否是字母用 isalpha(ch),若是,返回非零值(true),否则返回零(false)
判断是否是数字用 isdigit(num),若是,返回非零值(true),否则返回零(false)
**注意:上面提到的 isupper()、islower()、isdigit()、isalpha()均为宏定义,非真正的函数
5.在多余位置上补0的方法:
cout<<setw(n)<<setfill('0')<<i;
setw(n)表示设置位宽为 n,如果不进行设置,系统默认左对齐输出,设置后为右对齐,空出的位置以空格填充
setfill('0')表示以单个字符'0'填充空余位置,注意:setfill()中参数只能为单个字符,setfill(0)或者 setfill("0")均报错
i 为输出项
C++代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int min(int a,int b){ 4 if(a<b) return a; 5 else return b; 6 } 7 int main() { 8 char str[4][60]; 9 int count=0; 10 string week[7]={"MON ","TUE ","WED ","THU ","FRI ","SAT ","SUN "}; 11 cin>>str[0]>>str[1]>>str[2]>>str[3]; 12 int len0,len2; 13 len0=min(strlen(str[0]),strlen(str[1])); 14 len2=min(strlen(str[2]),strlen(str[3])); 15 for(int i=0;i<len0;i++){ 16 if(str[0][i]==str[1][i]){ 17 if(count==0){ 18 if(str[0][i]>='A'&&str[0][i]<='G'){ 19 cout<<week[(str[0][i]-'A')]; 20 count++; 21 } 22 } 23 else if(count==1){ 24 if(str[0][i]>='A'&&str[0][i]<='N'){ 25 cout<<(10+(str[0][i]-'A'))<<':'; 26 break; 27 } 28 else if(isdigit(str[0][i])){ 29 cout<<setw(2)<<setfill('0')<<str[0][i]<<':'; 30 break; 31 } 32 } 33 } 34 } 35 for(int i=0;i<len2;i++){ 36 if(str[2][i]==str[3][i]){ 37 if(isalpha(str[2][i])){ 38 cout<<setw(2)<<setfill('0')<<i; 39 break; 40 } 41 } 42 } 43 system("pause"); 44 return 0; 45 }