题目链接在此。
题意理解
给出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的格式输出。
注意点
“题意理解”中加粗的部分就是解题的题眼,只需要抓住这些就可以,但是需要注意一些细节,比如: 字母范围的限制要严格,否则“答案错误”。
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;
}
这段代码较冗长,可以移步这里,查看更简洁版的代码。