1061 Dating (20 分)坑点大全

本文解析了PAT乙级1061 Dating题目的解题思路,介绍了如何通过对比字符串找出约会的星期、时间等关键信息,并提供了详细的C语言代码实现及注意事项。
摘要由CSDN通过智能技术生成

1061 Dating (20分)

点此跳转OJ网址

此题与PAT乙级的 1014 福尔摩斯的约会 一样,只是以中文表述罢了,看不懂英文题的直接点题目超链接即可。

题意分析:

所有关键信息都是在两行对应位置相同字符(common )中取得的,所以第1,2行和3,4行分别同步遍历,第一步先判断字符是否相同,才进行下一步判断。

一共有3个关键信息:

  1. 周几:第1,2行的首个相同的大写字母"A~G"代表周一 ~ 周日;
  2. 几点钟:在1,2行,必须出现在判断周几的"A~G"之后!出现相同的"0~9"代表0~9点钟或"A~N"(大写)代表10~23点钟。
  3. 几分钟:在3,4行,首个相同的字母(大小写均可)的下标(0~59)即为分钟。

 C语言代码(含详细注释和坑点提示)


#include<stdio.h>
char Week[][4] = { "MON","TUE","WED","THU","FRI","SAT","SUN" }; //★坑点★ 请检查有无写错!(尽量用复制粘贴不要自己敲)
#define MAX_LEN 61    // 4 non-empty strings of no more than 60 characters without white space 。要+1空间存'\0'。
char buf0[MAX_LEN], buf1[MAX_LEN];
int main() {
	int w = -1, h;  //w=0~6 表示周一~周日 ; h小时
	gets(buf0); gets(buf1);     //C语言的此法不安全,若用C++可以 cin.getline(buf0,MAX_LEN); 代替。
	for (int i = 0; buf0[i] &&buf1[i]; ++i) {   //直到其中一个结尾
		if (buf0[i] == buf1[i]) {   //首先对应位字符必须相同,然后buf0,buf1仅需判断其中一个。
			if (-1 == w) {  //★坑点★ 要先判断是周几,只需以w作flag。不能与下面判断 为字母A~G合并!
				if('A'<=buf0[i] && buf0[i]<='G') {  //若可以是全部大写字母,可用isupper()代替
					w = buf0[i] - 'A';  //Week['A'-'A']="MON" 所以是减'A'
				}
			} //否则已经取得周几,开始判断几点钟。
			else if(isdigit(buf0[i])) { //是数字0~9
				h = buf0[i] - '0';
                break;  //★坑点★ 不跳出会被第3个,4个,……所覆盖!(测试点2会错误)
			}
			else if('A'<=buf0[i] && buf0[i]<='N') {
				h = buf0[i] - ('A' - 10);   //★坑点★ 'A'算做h=10! 也可写作 h = buf0[i] - 'A' + 10;
                break;  //★坑点★ 不跳出会被第3个,4个,……所覆盖!(测试点2会错误)
			}
		}
	}
    //if(w<0 || w>6 || h<0 || h>23)return -1;   //【合法输入不会执行此语句】可以检测自己的求w和h是否越界。
	gets(buf0); gets(buf1); //第3,4行(可以覆盖,重复利用)
	for (int i = 0; buf0[i] &&buf1[i]; ++i) {       //i分钟
		if (buf0[i] == buf1[i] && isalpha(buf0[i])) {   //是相同字母(大小写皆可)
			printf("%s %02d:%02d\n", Week[w], h, i);    //★坑点★ 要注意HH:MM格式,个位数以0开头凑够2位。
			return 0;   //★坑点★ 只算第一个!及时跳出(也可用 break; 下面要改返回0)
		}
	}
	return -1;  //【合法输入不会执行此语句】
}

若要在C++中执行,需将gets(...)部分改为如下:

#include<cstdio>
#include<iostream>
//↑加在开头

//↓代替所有 gets(...) 的行
std::cin.getline(buf0, MAX_LEN); std::cin.getline(buf1, MAX_LEN);

此题不需要特别的STL库,反而C语言更简洁。C++的坑点也是一样的,可以通用。


我第一次做是用Python3 的,代码精简凝练!但是不熟练Python不建议用,不会zip,filter则丧失优势。

Week=('MON','TUE','WED','THU','FRI','SAT','SUN')
w,h=-1,-1
for e in filter(lambda e:e[0]==e[1],zip(input(),input())): 
    if -1==w:
        if 'A'<=e[0]<='G':
            w = ord(e[0])-ord('A')
    elif e[0].isdecimal():
        h=ord(e[0])-ord('0')    ;break
    elif 'A'<=e[0]<='N':
        h=ord(e[0])-ord('A')+10 ;break
for i,e in enumerate(zip(input(),input())):
    if e[0]==e[1] and e[0].isalpha():
        print("%s %02d:%02d" % (Week[w], h, i))
        exit(0)

注意是 Python3 !

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值