Basic Level ----- 1014 福尔摩斯的约会 (20分)

前言

环境:C++(g++6.5.0)
ps:阅读理解题。。。

题目

大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 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. 第二个需要找的是,前两个字符串中,在(1)中找到的字母之后,且位置相同,且在数字0~9之间或者在字母A-N之间,的字符
  3. 第三个需要找的是,后两个字符串中,位置相同,且为大写或为小写字母,的位置
  4. 我太颓了,没注意,找前两个字符串的时候,两个字符串的下标得一样,。。。,写了个循环嵌套

代码

/*1014 福尔摩斯的约会 (20分)*/

#include <iostream>
#include <string>
using namespace std;


void printday(char x)
{
	string day[7] = { "MON","TUE","WED","THU","FRI","SAT","SUN" };
	cout << day[x-'A']<<" ";
}

/*找到第一个相同的大写字母,将需要字母或数字存到c中*/
void find_Day_Hour(string s1,string s2,char *c){
	int pos=0;      //c的下标
	int len1=s1.length(),len2=s2.length();
	for(int i=0;i<len1;i++){
		if(s1[i]>='a'&&s1[i]<='z') continue;   				//小写字母直接跳过 
		if(pos==0&&s1[i]>='0'&&s1[i]<='9') continue;		//找第一个大写字母时,数字跳过 
		
		if(pos==0){        //此时找第一个: 相等的大写字母 A-G
			if(s1[i]>='A'&&s1[i]<='G')
				if(s1[i]==s2[i])  
					c[pos++]=s1[i];
			
		}else{			   //此时找第二个: 0-9 或 A-N 
				if((s1[i]>='0'&&s1[i]<='9')||(s1[i]>='A'&&s1[i]<='N')){
					if(s1[i]==s2[i]){
					c[pos]=s1[i];
					pos++;
					break;
					}
				}
				
		}
		if(pos==3) return;        //如果pos==3,表示两个字符都已经找到,停止查询 
	}
	
} 

/*找到第一对相同字母出现的位置  */
int find_Minute(string s3,string s4){
	int len3=s3.length(),len4=s4.length();
	int pos=0;
	while(pos<len3&&pos<len4){
		if((s3[pos]>='a'&&s3[pos]<='z')||(s3[pos]>='A'&&s3[pos]<='Z')){
			if(s3[pos]==s4[pos])
				return pos;
		}
		
		pos++;
	} 
	return 0;
}

/*int转为string,若为个位数,加0*/
string Trans(int n){
	string temp;
	temp.push_back(n/10+'0');
	temp.push_back(n%10+'0');
	return temp;
}

int main(){
	
	string str[4];
	for(int i=0;i<4;i++)
		cin>>str[i];

	char c[2];               //c[0]存储第一个大写字母,c[1]存储第二个大写字母或数字 
	find_Day_Hour(str[0],str[1],c); 
	
	string hour;
	if(c[1]>='0'&&c[1]<='9') hour=Trans(c[1]-'0');
	else hour=Trans(10+c[1]-'A');
	
	
	string min;
	int m=find_Minute(str[2],str[3]);
	min=Trans(m);
	
	printday(c[0]);
	cout<<hour<<":"<<min;
	return 0;
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值