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

 

posted @ 2020-02-12 16:52  Jason66661010  阅读(162)  评论(0编辑  收藏  举报