PAT-B 1014. 福尔摩斯的约会 (20)

这是一篇关于PAT乙级考试中1014题目的解析博客。文章详细介绍了如何理解题意,特别是关于日期和时间的转换规则,包括DAY、HH和MM的对应关系。博主提醒解题时要注意字母和数字的范围限制。文章提供了解决问题的AC代码,并提示有简洁版代码可供参考。
摘要由CSDN通过智能技术生成

题目链接在此

题意理解

给出4个字符串,前两个字符串包含两个信息:DAY和HH,后面两个字符串包含一个信息:MM。

下面是相关信息的识别信息和转换关系:
DAY:前两个字符串的第一对相同位置A-G的大写字母
转换关系:大写字母是从A开始的第几个,就是星期几。
HH:寻找信息DAY的位置之后的第一对相同位置的0-9或A-N的字符
转换关系:0-9对应0-9,A-N对应10-23
MM:后两个字符串的第一对相同位置的A-Za-z
对应关系:该字符所在字符串中的位置(从0开始)

最后按照DAY HH:MM的格式输出。

注意点

“题意理解”中加粗的部分就是解题的题眼,只需要抓住这些就可以,但是需要注意一些细节,比如: 字母范围的限制要严格,否则“答案错误”。

AC代码

#include<stdio.h>
#include<string.h> 

//星期对应的字符缩写映射 
char WeekMap[7][4] = {"MON","TUE","WED","THU","FRI","SAT","SUN"}; 

//字符时间对应的整形时间映射 
int HourMap(char x){ 
    if(x>= '0' && x<='9'){ //如果是0-9 
        return (x-'0'); 
    } else{ //否则为A-N 
        return (x-'A')+10;
    }
}



bool isUppercaseAtoG(char c) { //if c is a uppercase between A to G return true 
    return (c>='A' && c<='G'); 
}

bool isLetter(char x){ //如果x是一个字母(a-z & A-Z)返回true 
    return ( (x>='a' && x<='z') || (x>='A' && x<='Z') ); 
} 

bool isHour(char x){ //判断是不是"时间"位置的0-9或者A-N
    return ((x>='0' && x<='9') || (x>='A' && x<='N'));  
}

int main(){

    char a[60],b[60],c[60],d[60]; //a,b保存前两个字符串,c,d保存后两个字符串 

    scanf("%s%s%s%s",a,b,c,d);

    //找星期和小时
    int count = 0; //记录找到相同大写字母的次数,只需要找到两对即可 
    char week, hour; //用来保存星期和小时对应的字符 
    for(int i = 0; i < strlen(a); i++){
        for(int j = 0 ; j < strlen(b); j++){
            if(a[i] == b[j] && i==j){ //如果a[i]==b[j],并且两者位置相同 
                if(isUppercaseAtoG(a[i]) && count == 0){ //第一次相同字符(A-G)表示星期 
                    week = a[i]; 
                    count++;
                }else if(count == 1 && isHour(a[i]) ){ //第二次相同的字符表示小时 
                    hour = a[i];
                    count++; 
                }else if(count == 2){
                    break;
                }               
            }
        }
        if(count == 2) break; //提前结束,减小时间复杂度 
    } 

    //输出星期
    printf("%s ",WeekMap[(week-'A')]); //注意+1 
    //输出小时
    printf("%02d:",HourMap(hour));

    //找分钟
    int pc=0,pd=0;
    while(1){
        if((c[pc] == d[pd]) && isLetter(c[pc]) && isLetter(d[pd]) ) break; //如果c[pc]==d[pd]并且它俩都是字母的情况下,break 
        pc++;
        pd++;
    }

    //打印分钟 
    printf("%02d\n",pc);

    return 0;
} 

这段代码较冗长,可以移步这里,查看更简洁版的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值