PAT乙类1014 福尔摩斯的约会 (20 分)

一、题目

大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 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,所以遍历字符串的时候,第一个和第二个字符串的相同位置字母不仅一样,还要是A~G内的
  2. 先确定小时,之后才会考虑小时和分钟!!而且是在满足1条件的字母的位置后面查找,前面根本不在乎!!即不执行!用flag来判断(因为两个字符串第一个相同的字符是8,但题目的陈述的是E,这是隐含信息)
  3. 两个字符串中相同位置具有相同字母的对数不止两对,所以在确定小时之后一定要跳出循环,(0-9和A-N是相互矛盾的,谁先相同,用谁)不然后面还可能又有一对满足2的,这就错误了,有一个测试点的陷阱就在这里。
  4. 最后两个字符串中只要是字母就行,不分大小写在字符串的相对位置(从零开始计数)。
  5. 小时或者分钟不满足两位的要记得补零。
新函数
  1. switch的替换 -----string类型
    week字符串的使用感觉不错哦!!可以不用switch了,get到新技能

string week[7] = {“MON”, “TUE”, “WED”, “THU”, “FRI”, “SAT”, “SUN”};

  1. 输出01、02、03…补零

printf("%02d", j); //c语言,不建议用cout

  1. 判断大写字母、小写字母、数字的方法

str[0][j] >= ‘A’ && str[0][j] <= ‘G’
str[0][j] >= ‘0’ &&str[0][j] <= ‘9’
str[2][j] >= ‘a’ && str[2][j] <= ‘z’

  1. flag的使用
    它的使用,可以选择性的执行代码!!!如果多种执行块时!!

  2. 输出大写字母的位置。比如E,是第5个。

‘E’ - ‘A’ + 1

分析

1) 这个题目确实看起来有点复杂,但是它整个的思维是:
同时遍历两个字符串相同位置
1.字符相等,而且字符必须是大写字母,且必须在’A’ ~ ‘G’ 之间。(星期几)
2.字符相等,而且字符必须在’A’ ~ ‘N’ 或 ‘0’ ~ '9’之间 (小时)
3.字符相等, 而且必须是字母。(分钟)

#include 
#include 
#include 
using namespace std;

int main() {
	char str[4][61] = {" "};
	int i, j;    
	string week[7] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
	int flag = 0;
	int hour;
	for(i=0; i<4; i++) {
		cin>>str[i];
	}
	for(j=0; j<61; j++) {
		if(str[0][j] == str[1][j]) {
			if(flag == 0) {
				if(str[0][j] >= 'A' && str[0][j] <= 'G') {
					cout<= 'A' && str[0][j] <= 'N') {
					hour = str[0][j] - 'A' + 10;
					break;             //及时退出, 这两个是矛盾的 
				}else if(str[0][j] >= '0' && str[0][j] <= '9') {
					hour = str[0][j] - '0';
					break;            //及时退出,这两个是矛盾的 
				}
			}
		}
	}
	printf("%02d:", hour);     //hour也必须是02d形式!!!! 
	for(j=0, i=0; j<61; j++) {
		if((str[2][j] >= 'a' && str[2][j] <= 'z') || (str[2][j] >= 'A' && str[2][j] <= 'Z')) {
			if(str[2][j] == str[3][j]) {
				printf("%02d", j);
				break;
			}
		}
	}	
	return 0;
}



下面的只是我第一次的表示方法,有点绕,自己就是记录一下!!!!可以不看

#include 
#include 
#include 
using namespace std;

int main() {
	char str[4][61] = {" "};        //四个字符串。
	int i, j;   
	char c1, c2, c3, c4;         //用来保存临时字符。  
	string wens[7] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
	int flag = 0;                //用来判断星期是不是已经输出!!  
	int hour;                   //小时
	for(i=0; i<4; i++) {
		cin>>str[i];
	}
	for(j=0; j<61; j++) {
		if(str[0][j] >= 'A' && str[0][j] <= 'N') {    //不是任意一个字母就行的!!必须是在范围之内的 
			c3 = str[0][j];
			if(flag == 1 && c3 == str[1][j]) {
				hour = c3 - 'A' + 10;
				flag = 2;
				break;
			}
		}else if(str[0][j] >= '0' && str[0][j] <= '9') {
			c2 = str[0][j];
			if(str[1][j] == c2 && flag == 1) {     //是第一个字母相同后面找再相同的!! 
				hour = c2 - '0';
				break;
			}
 
		}
		if(str[0][j] >= 'A' && str[0][j] <= 'G') {   //不是任意一个字母相同就行的 
			c1 = str[0][j];
			if(str[1][j] == c1){
				if(flag == 0) {
					cout<= 'a' && str[2][j] <= 'z') || (str[2][j] >= 'A' && str[2][j] <= 'Z')) {
			c4 = str[2][j];         //最后一个条件只要是相同的字母就行,不区分大小写 
			if(c4 == str[3][j]) {
				printf("%02d", j);
				break;
			}
		}
	}	
	return 0;
}




你可能感兴趣的:(PAT)