1014 福尔摩斯的约会

时间:2020-12-19 18:46:23
// 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 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

#include <stdio.h>
#include <string.h>
#include <ctype.h>			// isupper()函数

// 时间输出函数
void PrintTime(int day, int hour, int min);

int main(void)
{
	char str1[61];
	char str2[61];			// 存储用户输入

	int day, hour, min;

	gets(str1);
	gets(str2);
	for (int i = 0; str1[i] != '\0'&&str2[i] != '\0'; i++)		// 以i为下标来同时遍历两个字符串
	{
		if (str1[i] == str2[i] && str1[i] >= 'A' && str1[i] <= 'G')				// 如果第一个相同大写字符找到,则day值确定,再接着分析hour值
		{
			day = str1[i] - 'A' + 1;
			for (int j = i + 1; str1[j] != '\0'&&str2[j] != '\0'; j++)	// 分析hour值是从day之后的位置继续遍历两个字符串,以j为下标
			{
				if (str1[j] == str2[j] && str1[j] >= 'A' && str1[j] <= 'N')			// 如果相同的是大写字母
				{
					hour = str1[j] - 'A' + 10;
					break;												// hour确定,跳出循环
				}
				else if (str1[j] == str2[j] && str1[j] >= '0' && str1[j] <= '9')	// 如果相同的是数字
				{
					hour = str1[j] - '0';
					break;												// 跳出循环
				}
			}
			break;												// 跳出循环
		}
	}

	gets(str1);
	gets(str2);
	for (int i = 0; str1[i] != '\0'&&str2[i] != '\0'; i++)
	{
		if (str1[i] == str2[i] && isalpha(str1[i]))
		{
			min = i;
			break;
		}
	}

	PrintTime(day, hour, min);

	return 0;
}

void PrintTime(int day, int hour, int min)
{
	switch (day)
	{
	case 1:
		printf("MON ");
		break;
	case 2:
		printf("TUE ");
		break;
	case 3:
		printf("WED ");
		break;
	case 4:
		printf("THU ");
		break;
	case 5:
		printf("FRI ");
		break;
	case 6:
		printf("SAT ");
		break;
	case 7:
		printf("SUN ");
		break;
	default:
		break;
	}
	printf("%02d:%02d", hour, min);
	return;
}

// 这道简单的题我做起来是一波三折,让我不禁怀疑起我的智商了,别人做题是踩坑,相比起来,我更像是平地摔
// 我平地摔的位置如下:
// 1:第一次,我采用了char * pstr1, char * pstr2两个指针作为遍历指针,VS运行样例正常,然后,PAT告诉我,段错误,检查无果,遂改写(手贱没有保存当时写的码,看来很长一段时间内我是不会知道我错误的原因了)
// 2:第二次,我用	for (int i = 0; str1[i] != '\0'&&str2[i] != '\0'; i++)	这种正常的方式进行遍历,样例运行也正确,但是不是满分。检查了很久,发现,代表日期的字母,只有在A到G之间才是有效的
// 3:第三次,吸取了上次的教训,将日期的字母限制在A到G之间,把小时的字母限制在0到9与A到N之间,然后,还是有两个测试样例0分
// 4:洗了个澡拉了坨屎,重新坐在电脑面前,把题重新读了一遍,发现,代表分钟的匹配项,必须是字母,即a到z及A到Z之间,改了之后。。。终于所有测试样例都能通过了。。
// 这告诉我们:做这种编程题,一定要搞清楚题意。上了班之后,一定要搞清楚用户需求!!!!!地基打错了,楼盖的再漂亮,迟早都要拆。