PAT 1014 福尔摩斯的约会

题目描述:

大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 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;(这里格外注意输出时候的变换);
  3. 相等的字符必须是字母,大小写都无所谓。
#include<iostream>
#include<string>

using namespace std;

void date(char s);

int main()
{
	string s1,s2,s3,s4;
	cin >> s1 >> s2 >>s3 >>s4;
	int a=1;	//用a去表明是第几个相等的字符; 
	char day,hour;	
	int minute;	
	for(int i=0;i<s1.length()&&i<s2.length();++i){	
		if(s1[i]==s2[i]&&((s1[i]>='0'&&s1[i]<='9')||(s1[i]>='A'&&s1[i]<='N'))){	//满足第二个条件 
			//第二次找到的相等字符; 
			if(a==2){
					hour = s1[i];
					break;
			}
		}
		if(s1[i]==s2[i]&&(s1[i]>='A'&&s1[i]<='G')){	//字符相等 且满足第一个条件; 
			//第一次找到的相等字符; 
			if(a==1){
				date(s1[i]);
				a++;
			}
			continue;
		}
	}
	//第三个条件; 
	for(int j=0;j<s3.length()&&j<s4.length();++j){
			if(s3[j]==s4[j]&&(s3[j]>='A'&&s3[j]<='z'))
			{
				minute = j;
			}
	}
	//小时在0~9之间,需要在前面补0; 
	if(hour>='0'&&hour<='9'){
		cout <<'0'<<hour<<":";
	}
	//在‘A’~‘N’之间,需要转化,如下式: 
	else{
		cout <<hour-'A' + 10 <<":";
	}
	//分钟的输出格式; 
	printf("%02d",minute);
	return 0;
 } 

 void date(char s){	
	switch(s){
		case 'A':	
		cout<< "MON ";	
		break;
		case 'B':
		cout<< "TUE ";
		break;
		case 'C':
		cout<< "WED ";
		break;
		case 'D':
		cout<< "THU ";
		break;
		case 'E':
		cout<< "FRI ";
		break;
		case 'F':
		cout<< "SAT ";
		break;
		case 'G':
		cout<< "SUN ";
		break;
	}
}

 小结:代码思路清楚,但是写的长了,还有优化的空间,需要注意的有:

  • 在遍历的时候,将第二个条件放在第一个条件之前,是为了避免第一个条件对a的操作影响第二个条件,因为第一二条件之间是有重合的,你会发现有些情况下那个相等的字符既可以进入条件1也可进入条件2,所以需要调整顺序;
  • hour的输出,在0~9需要补0,在A~N需要转化成数字(hour-'A'+10);
  • minute的输出格式我用了printf,是为了方便,一般情况下不建议cin与scanf,cout与printf混用,因为有的时候会发生难以预料的错误。在有些情况下可以混用,日后有机会将整理一下这个问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值