PAT (Basic Level) Practice 1014 福尔摩斯的约会 (20分) (string的find函数中没查找到返回s.npos)
1题目
大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 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
2.题目分析
1.星期是第一个、第二个字符串中第一对相等的字符:该字符要在A到G;该字符在两个字符串中的位置要相同; 使用flag判断,找到后跳到找第二个的步骤
2.小时是第一个、第二个字符串中第二对相等的字符:该字符在0到9+A到N;该字符在两个字符串中的位置要相同;找到后立即break,有可能还存在第三对相等字符,会覆盖答案
3.分钟是三、四字符串中第一对相等的字符
小时、分钟输出如果是<10,要加0在前面
4.string中的find函数未查找到内容返回s.npos
3.代码
方法一:
#include<stdio.h>
int main()
{
char a[100], b[100], c[100], d[100];
int flag = 0, i, j, k = 0, m = -1, flag2 = 0;
gets(a); gets(b); gets(c); gets(d);
for (i = 0; a[i] != '\0'&&b[i] != '\0'; i++)
{
if (a[i] == b[i] && (a[i] >= 'A'&&a[i] <= 'G')&&flag==0)
{
switch (a[i])
{
case'A':printf("MON "); break;
case'B':printf("TUE "); break;
case'C':printf("WED "); break;
case'D':printf("THU "); break;
case'E':printf("FRI "); break;
case'F':printf("SAT "); break;
case'G':printf("SUN "); break;
}
flag++;
}
else if ((a[i] == b[i] && (a[i] >= 'A'&&a[i] <= 'N') && flag == 1)||(a[i]==b[i]&& (a[i] >= '0'&&a[i] <= '9')&&flag==1))
{
switch (a[i])
{
case'0':printf("00:"); break;
case'1':printf("01:"); break;
case'2':printf("02:"); break;
case'3':printf("03:"); break;
case'4':printf("04:"); break;
case'5':printf("05:"); break;
case'6':printf("06:"); break;
case'7':printf("07:"); break;
case'8':printf("08:"); break;
case'9':printf("09:"); break;
case'A':printf("10:"); break;
case'B':printf("11:"); break;
case'C':printf("12:"); break;
case'D':printf("13:"); break;
case'E':printf("14:"); break;
case'F':printf("15:"); break;
case'G':printf("16:"); break;
case'H':printf("17:"); break;
case'I':printf("18:"); break;
case'J':printf("19:"); break;
case'K':printf("20:"); break;
case'L':printf("21:"); break;
case'M':printf("22:"); break;
case'N':printf("23:"); break;
}
flag++;
}
}
for (i = 0; c[i] != '\0'&&d[i] != '\0'; i++)
{
m++;
if (c[i] == d[i] && ((c[i] >= 'A'&&c[i] <= 'Z') || (c[i] >= 'a'&&c[i] <= 'z')))
{
flag2++;
if (m <= 9)
printf("0%d", m);
else
printf("%d", m);
}
if (flag2 == 1)
break;
}
}
方法2:
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
string a, b, c, d;
char aa, bb;
int cc;
cin >> a >> b >> c >> d;
int flag = 0;
for (int i = 0; i < a.length(); i++)
{
if (flag==0&&a[i] >= 'A'&&a[i] <='G'&&b.find(a[i])!=b.npos)
{
if(i<=b.length()&&a[i]==b[i])
aa = b[i];
flag++;
}
else if ( flag >0&&((a[i] >= 'A'&&a[i] <='N') || (a[i] >= '0'&&a[i] <='9')) && b.find(a[i]) != b.npos)
{
if (i <= b.length() && a[i] == b[i])
{
bb = b[i];
break;
}
}
}
for (int i = 0; i < c.length(); i++)
{
if (c[i] >= 'A'&&c[i] <= 'z'&&d.find(c[i]) != d.npos)
{
if (i <= d.length() && c[i] == d[i])
{
cc = i; break;
}
}
}
switch (aa)
{
case'A':printf("MON "); break;
case'B':printf("TUE "); break;
case'C':printf("WED "); break;
case'D':printf("THU "); break;
case'E':printf("FRI "); break;
case'F':printf("SAT "); break;
case'G':printf("SUN "); break;
}
int hour = 0;
if (bb >= '0'&&bb <= '9')
{
hour = bb - 48; cout << "0" << hour << ":";
}
else if (bb >= 'A'&&bb <= 'N')
{
hour = bb - 55; cout << hour << ":";
}
if (cc >= 0 && cc <= 9)cout << "0" << cc;
else
cout << cc;
cout << endl;
}
//3485djDkxh4hhG0
//2984akDfkkkkgg0dsb
//s&hg1234567sfdk
//s&Hy7659321scvnm