欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PAT (Basic Level) Practice 1014 福尔摩斯的约会 (20分) (string的find函数中没查找到返回s.npos)

程序员文章站 2022-03-14 19:39:44
...

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