题目描述
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 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 <bits/stdc++.h>
using namespace std;
int main(){
string a,b,c,d;
cin>>a>>b>>c>>d;
int al,bl,cl,dl;
al=a.length();
bl=b.length();
cl=c.length();
dl=d.length();
char day;
int i=0,loca,locb;
while(i!=al){
if(a[i]>='A'&&a[i]<='G'){
if(b.find_first_of(a[i])!=-1){
day=a[i];
break;
}
}
i++;
}
loca=a.find_first_of(day);
locb=b.find_first_of(day);
// cout<<loca<<" "<<locb<<endl;
switch(day){
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;
}
}
// cout<<i;
i=0;
char time;
while(i!=al){
if((a[i]>='0'&&a[i]<='9')||(a[i]>'A'&&a[i]<='N')){
if(b.find_first_of(a[i],locb+1)!=-1){
time=a[i];
// cout<<time<<endl;
break;
}
}
i++;
}
switch(time){
case '0':{
cout<<"00:";
break;
}
case '1':{
cout<<"01:";
break;
}
case '2':{
cout<<"02:";
break;
}
case '3':{
cout<<"03:";
break;
}
case '4':{
cout<<"04:";
break;
}
case '5':{
cout<<"05:";
break;
}
case '6':{
cout<<"06:";
break;
}
case '7':{
cout<<"07:";
break;
}
case '8':{
cout<<"08:";
break;
}
case '9':{
cout<<"09:";
break;
}
case 'A':{
cout<<"10:";
break;
}
case 'B':{
cout<<"11:";
break;
}
case 'C':{
cout<<"12:";
break;
}
case 'D':{
cout<<"13:";
break;
}
case 'E':{
cout<<"14:";
break;
}
case 'F':{
cout<<"15:";
break;
}
case 'G':{
cout<<"16:";
break;
}
case 'H':{
cout<<"17:";
break;
}
case 'I':{
cout<<"18:";
break;
}
case 'J':{
cout<<"19:";
break;
}
case 'K':{
cout<<"20:";
break;
}
case 'L':{
cout<<"21:";
break;
}
case 'M':{
cout<<"22:";
break;
}
case 'N':{
cout<<"23:";
break;
}
}
int min;
i=0;
for(i=0;i<cl;i++){
if((c[i]==d[i])&&(c[i]>='a'&&c[i]<='z')||(c[i]>='A'&&c[i]<='Z')){
min=i;
break;
}
}
if(min<10) cout<<"0"<<min<<endl;
else cout<<min<<endl;
}
使用string中的find_first_of()函数,find_first_of(string &str, size_type index = 0):用于查找在字符串中第一个与str中的某个字符匹配的字符,返回它的位置。搜索从index正向开始,如果没找到就返回string::npos(-1)
题目中要求从第一对相同大写字母后接着查找第二对,而不是从头开始查找,这里一开始卡了很久。查了查发现find_first_of可以设置开始查找的起始点,这就容易多了。