关于算法-数据结构:PAT甲级1061-Dating

34次阅读

共计 2343 个字符,预计需要花费 6 分钟才能阅读完成。

题目粗心:

给出 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<char,string> capitalLetterToWeek;// 大写字母到星期的映射
unordered_map<char,int> 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 位整数。
提交后果:

AC 代码:
#include<cstdio>
#include<string>
#include <iostream>
#include <unordered_map>

using namespace std;

unordered_map<char,string> capitalLetterToWeek;// 大写字母到星期的映射
unordered_map<char,int> 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;
}


正文完
 0