资讯详情

PAT乙级1014 福尔摩斯的约会

1014 约会福尔摩斯 福尔摩斯侦探收到了一张奇怪的纸条:让我们约会吧!

3485djDkxh4hhGE

2984akDfkkkkggEdsb

s&hgsfdk

d&Hyscvnm。

大侦探很快就明白了,字条上奇怪的乱码其实是周四约会的时间 14:04,因为前两个字符串是第一个 1 相同的大写英文字母(大小写有区别)是第一个 4 个字母 D,代表周四;第 2 相同的字符是 E ,那是第 5 英文字母,代表一天中的第一个 14 所以一天 0 点到 23 点由数字 0 到 以及大写字母 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

其实这个问题有点难,我在PTA上面发现通过率不高,只有16.36%,所以写一个小问题

这个问题的难点是有很多边界条件和隐藏条件,所以很容易判断错误。我在代码中写了一个更详细的注释,应该可以通过代码直接窥视豹获得想法。

代码如下:

#include<iostream> #include<string> #include<vector> /* 这个问题是迄今为止最阴险的问题,有很多边界条件和隐含条件。 如果不是靠网上测试案例慢慢测试补充bug,我可能一辈子都找不到我。bug和这些隐藏条件 */  using namespace std; int main(){     vector<char>character;     vector<char>::iterator it;     char n[3];     ///两个用于存储输入字符string类型      string sentence1,sentence2;     ///这里定义的一个bool其实类型是为了防止‘’N以后的字符作为第一个元素直接压入栈中      bool flag = false;     cin>>sentence1>>sentence2;     for(int i=0;i<sentence1.length();i  ){         if(sentence1[i]==sentence2[i]){          //第一对相同的字符串只接收大写字母,这点要注意              if(sentence1[i]>='A'&&sentence1[i]<='G'&&flag == false){                 character.push_back(sentence1[i]);                 ///读完第一个元素后,就把flag变成1,即现在允许读入第二对字符                  flag = true;             }             //第二对字符必须从‘0’到‘’N这一点需要注意。一开始,我可以把它当作所有的字符,就会出错              else if(flag == true&&sentence1[i]<='N'&&sentence1[i]>='0'){                 character.push_back(sentence1[i]);                 break;             }         }     }     cin>>sentence1>>sentence2;     for(int i=0;i<sentence1.length();i  ){      ///第三对字符串只需要字母。          if(sentence1[i]==sentence2[i]&&sentence1[i]>='A'&&sentence1[i]<='z'){             character.push_back(i);             break;         }     }     ///这是把vector中间元素赋予数组,便于后续输出      it = character.begin();     for(int i=0;i<3;i  ){         n[i] = *it;         it  ;     }     ///判断一周switch      switch(n[0]){         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;         default:             break;     }     ///这里的字符需要分为情况,从‘0’到‘9’A'到'Z需要分开处理的处理方法不同      if(n[1]>='0'&&n[1]<='9')      ///需要改为C语言风格输出,以便更改格式。如果这里不这样输出,就没有前0          printf("d",n[1]-0;     else if(n[1]>='A'&&n[1]<='Z')     ///这里加10是因为需要便宜的操作,A实际上是10          cout<<n[1]-'A' 10;     cout<<":";     //这里的n[2]似乎直接转2]int类型,不用去-'0,这对我来说很奇怪      printf("d",n[2]);     return 0; }

C语言福尔摩斯约会(OJ题)附测试用例 输出结果 思路解释_java_leading的博客-CSDN博客

附上CSDN上面看到的测试用例,用这个慢慢把握bug找出来的 测试一: 3469djDkxh4hhG0 2974dlDfkkkkgg0dsb s&hgfdkiggggs d&Hycvnmzzzzs 输出: THU 00:12 测试二: IcCO2eA IcCO2eB cCaseC cCaseD 输出 WED 02:00 测试三: 6985djEkxh4hhGE 2984adEfkkkkggEdsb s&hgsfdk d&Hyscvnm 输出: FRI 14:04 测试四: 3485djGkxh4hhG2 2984akGfkkkkgg2dsb s&hgsfdk d&hyscvnm 输出: SUN 02:02 测试五: 3485djDkxh4hhG82984akDfkkkkggEdsb 2984akDfkkkkgg8da s&hgsfdk d&Hyscvnm 输出: THU 08:04

标签: hhg1s固体继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台