PAT_甲级_1061 Dating

题目大意:

给出4个字符串,其中前两个字符串包含两个信息:DAY和HH,后两个包含一个信息:MM。
下面给出这个信息的识别信息和转换关系:
DAY:前两个字符串的第一对相同位置的A~G的大写字母。
转换关系: 大写字母是从A开始的第几个,就是星期几。
HH:寻找信息DAY的位置之后的第一对相同位置的0~9或A-N的字符。
转换关系: 0-9对应0-9,A-N对应10-23。
MM:后两个字符串的第一对相同位置的A-Z或a~z的英文字母。
转换关系: 该字符所在的位置(从0开始)。
最后按DAY HH:MM的格式输出。

算法思路:

首先为了方便输出,使用capitalLetterToWeek建立大写字母到星期的映射,hours建立0~9和A~N到0~23的映射,其初始化的方法见如下init(),然后使用s1,s2,s3,s4接受4个字符串,使用found_capital记录是否已经找到了大写字母,在s1和s2找到相同的字符时,首先判断found_capital是否为true,如果不是则判断当前的字符是否是大写字母A到G,如果是则输出该字符对应的星期capitalLetterToWeek[s1[j]],如果found_capital为true,则判断当前字符是否是数字0~9或者A~N,如果是则输出该字符对应的小时hours[s1[j]],最后遍历s3和s4,只要找到第一个相等的字母,输出其位置即可。

初始化:
unordered_map capitalLetterToWeek;//大写字母到星期的映射
unordered_map hours;// 0~9和A~N到0~23的映射
void init(){
    capitalLetterToWeek['A'] = "MON";
    capitalLetterToWeek['B'] = "TUE";
    capitalLetterToWeek['C'] = "WED";
    capitalLetterToWeek['D'] = "THU";
    capitalLetterToWeek['E'] = "FRI";
    capitalLetterToWeek['F'] = "SAT";
    capitalLetterToWeek['G'] = "SUN";
    for (int k = 0; k < 24; ++k) {
        if(k<10){
            hours['0'+k] = k;
        } else{
            hours['A'+k-10] = k;
        }
    }
}
注意点:
1、代表星期的大写字母为A到G,代表小时的大写字母为A到N,代表分钟的字符是英文字母。
2、小时和分钟的格式都得保留2位整数。

提交结果:

截屏2020-10-09 上午9.39.40.png

AC代码:
#include
#include
#include 
#include 

using namespace std;

unordered_map capitalLetterToWeek;//大写字母到星期的映射
unordered_map hours;// 0~9和A~N到0~23的映射
void init(){
    capitalLetterToWeek['A'] = "MON";
    capitalLetterToWeek['B'] = "TUE";
    capitalLetterToWeek['C'] = "WED";
    capitalLetterToWeek['D'] = "THU";
    capitalLetterToWeek['E'] = "FRI";
    capitalLetterToWeek['F'] = "SAT";
    capitalLetterToWeek['G'] = "SUN";
    for (int k = 0; k < 24; ++k) {
        if(k<10){
            hours['0'+k] = k;
        } else{
            hours['A'+k-10] = k;
        }
    }
}

// 判断代表星期的大写字母
bool isCapitalInWeek(char c){
    return c >= 'A' && c <= 'G';
}

// 判断代表小时的大写字母
bool isLetterInHour(char c){
    return (c >= 'A' && c <= 'N');
}

// 判断是否是字母
bool isLetter(char c){
    return (c >= 'A' && c <= 'Z')||(c >= 'a' && c <= 'z');
}

//判断是否是数字
bool isNum(char c){
    return (c>='0'&&c<='9');
}

int main(){
    init();// 初始化
    string s1,s2,s3,s4;
    cin>>s1>>s2>>s3>>s4;
    //首先获得s1和s2的大写字母和第二个相同的字符
    bool found_capital = false;// 记录是否已经找到了大写字母
    for (int j = 0; j < s1.size() && j < s2.size(); ++j) {
        if(s1[j]==s2[j]){
            if (found_capital){
                // 已经找到大写字母了,现在的字符代表时间
                if(isLetterInHour(s1[j])||isNum(s1[j])){
                    printf("%02d:",hours[s1[j]]);
                    break;
                }
            } else if(isCapitalInWeek(s1[j])){
                printf("%s ",capitalLetterToWeek[s1[j]].c_str());
                found_capital = true;
            }
        }
    }
    //然后获得s3和s4相同字符的位置
    for (int j = 0; j < s3.size() && j < s4.size(); ++j){
        if(s3[j]==s4[j]&&isLetter(s3[j])){
            printf("%02d",j);
            break;
        }
    }
    return 0;
}


你可能感兴趣的:(算法-数据结构,c++)