PAT Basic 1014. 福爾摩斯的約會 (20)(C語言實現)

我的PAT系列文章更新重心已移至Github,歡迎來看PAT題解的小伙伴請到Github Pages瀏覽最新內容。此處文章目前已更新至與Github Pages同步。歡迎star我的repo

題目

大偵探福爾摩斯接到一張奇怪的字條:我們約會吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm。大偵探很快就明白了,字條上奇怪的亂碼實際上就是約會的時間星期四 14:04,因為前面兩字符串中第 1
對相同的大寫英文字母(大小寫有區分)是第 4 個字母 D,代表星期四;第 2 對相同的字符是 E ,那是第 5 個英文字母,代表一天里的第 14
個鐘頭(于是一天的 0 點到 23 點由數字 0 到 9、以及大寫字母 AN 表示);后面兩字符串第 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

思路

這道題因為題目敘述的模糊性讓好多人嘗試了很多次才成功,比如“第二對相同的字符”的描述就很不好理解,其實如果題目敘述更加明確一點,很多人就不用遭罪了

  • 確定星期:前兩個字符串中位置相同且字符相同的第一個大寫字母,并且應處于[A-G]
  • 確定小時:接星期的字符向后查找,位置相同的下一個相同的字符,并且處于[0-9A-N]
  • 確定分鐘:后兩個字符串中位于相同位置且相同的第一個字母

代碼

最新代碼@github,歡迎交流

#include <stdio.h>
#include <ctype.h>

int main()
{
    char str1[61], str2[61], str3[61], str4[61];
    scanf("%s %s %s %s", str1, str2, str3, str4);

    /* Find day, same char from [A-G] and same position in frist two lines */
    int DAY;
    char *weekdays[] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
    for(DAY = 0; str1[DAY] && str2[DAY]; DAY++)
        if(str1[DAY] == str2[DAY] && str1[DAY] >= 'A' && str1[DAY] <= 'G')
        {
            printf("%s", weekdays[str1[DAY] - 'A']);
            break;
        }

    /* Find hour, picking up from DAY, same character and position, [A-N|0-9] */
    int HH;
    for(HH = DAY + 1; str1[HH] && str2[HH]; HH++)
        if(str1[HH] == str2[HH])
        {
            if(str1[HH] >= 'A' && str1[HH] <= 'N')
            {
                printf(" %02d", str1[HH] - 'A' + 10);
                break;
            }
            if(isdigit(str1[HH]))
            {
                printf(" %02d", str1[HH] - '0');
                break;
            }
        }

    /* Find minute, same alphabet character from last two lines */
    int MM;
    for(MM = 0; str3[MM] && str4[MM]; MM++)
        if(str3[MM] == str4[MM] && isalpha(str3[MM]))
        {
            printf(":%02d", MM);
            break;
        }

    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容