您的位置:首页 > 其它

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

2017-02-21 09:26 295 查看
题目链接在此

题意理解

给出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;
}


这段代码较冗长,可以移步这里,查看更简洁版的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: