1014 福尔摩斯的约会

29 篇文章 0 订阅

大侦探福尔摩斯接到一张奇怪的字条:

我们约会吧! 
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~Z

2.确定小时:注意小时的范围是0~9和A~N

3.确定分钟:注意是字母即可

4.分钟和小时输出:都要不超过10的开头补上0,来补足两位

#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

//寻找相同字母的函数,返回相同字母所在的位置 
int samechar(string s1, string s2, int option);

//寻找第二个相同字母 ,返回相同字母所在的位置
int secsamechar(string s1, string s2);

int main() {
	string week[7] = { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };
	string a1, a2, b1, b2;
	cin >> a1;
	cin >> a2;
	cin >> b1;
	cin >> b2;
	char same1 = a1[samechar(a1, a2, 1)], same2 = a1[secsamechar(a1, a2)];
	int hour;
	if ('0' <= same2 && same2 <= '9') {
		hour = same2 - '0';
	}
	else {
		hour = same2 - 'A' + 10;
	}
	//最后面对不满足两位的情况使用0来进行填充,小时和分钟都要注意 
	//setw() 函数用于设置字段的宽度只对紧接着的输出产生作用
	//采取格式化输出的方式针对小时和分钟小于10的补0凑够两位
	cout << week[int(same1) - 65] << " " << setw(2) << setfill('0') << hour << ":" 
		<< setw(2) << setfill('0') << samechar(b1, b2, 0);
	return 0;
}

//寻找相同字母的函数,返回相同字母所在的位置 
int samechar(string s1, string s2, int option) {
	//获取两个字符串中较短的那个的长度,确保以长度短的字符串为准,
	//防止出现一个字符串到终点了,搜索对比字符串还没停止
	int len = s1.size() < s2.size() ? s1.size() : s2.size();
	int i;
	//因为前两组和后两组找相同字母的要求不同,所以加一个选择来进行区分
	//option=1要求范围A~G,option=2要求0~9或者A~N,option=0要求是字母即可
	if (option == 1) {
		for (i = 0; i < len; i++) {
			if (s1[i] == s2[i] && ('A' <= s1[i] && s1[i] <= 'G')) {
				break;
			}
		}
	}
	else if (option == 2) {
		for (i = 0; i < len; i++) {
			if (s1[i] == s2[i] && (('A' <= s1[i] && s1[i] <= 'N') || 
				('0' <= s1[i] && s1[i] <= '9'))) {
				break;
			}
		}
	}
	else {
		for (i = 0; i < len; i++) {
			if (s1[i] == s2[i] && (('A' <= s1[i] && s1[i] <= 'Z') || 
				('a' <= s1[i] && s1[i] <= 'z'))) {
				break;
			}
		}
	}
	return i;
}

//寻找第二个相同字母,返回相同字母所在的位置 
int secsamechar(string s1, string s2) {
	int pos = samechar(s1, s2, 1);
	string s3 = s1.substr(pos + 1), s4 = s2.substr(pos + 1);
	return samechar(s3, s4, 2) + pos + 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值