Python编程基础题(14-福尔摩斯的约会)

Description
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧!
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示);后面两字符串第 1 对相同的英文字母 s 出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。

Input
输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。

Output
在一行中输出约会的时间,格式为 DAY HH:MM,其中 DAY 是某星期的 3 字符缩写,即 MON 表示星期一,TUE 表示星期二,WED 表示星期三,THU 表示星期四,FRI 表示星期五,SAT 表示星期六,SUN 表示星期日。题目输入保证每个测试存在唯一解。

Sample Input
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm

Sample Output
THU 14:04

参考程序

def Getmin(a,b):
    if a<b:
        return a
    else:
        return b

def Find2(str1,str2):
    length=Getmin(len(str1),len(str2))
    cnt,i=0,0
    ls=[]
    while i <length:
        if cnt==0:
            if str1[i]==str2[i] and str1[i] in "ABCDEFG":
                ls.append(str1[i])
                cnt+=1
            i+=1
        else:
            if str1[i]==str2[i]:
                if str1[i] in "0123456789":
                    ls.append(str1[i])
                    break
                elif str1[i] in "ABCDEFGHIJKLMN":
                    ls.append(str1[i])
                    break
                else:
                    i+=1
            else:
                i+=1
    return ls

def Find1(str1,str2):
    m=Getmin(len(str1),len(str2))
    for i in range(m):
        if str1[i].isalpha() and str1[i]==str2[i]:
            break
    return i

st1=input()
st2=input()
st3=input()
st4=input()
week=" ABCDEFG"
hour="0123456789ABCDEFGHIJKLMN"
di={1:'MON',2:"TUE",3:"WED",4:"THU",5:"FRI",6:"SAT",7:"SUN"}
wh=Find2(st1,st2)
day=di[week.index(wh[0])]
hour=hour.index(wh[1])
print("{0} {1:02d}:{2:02d}".format(day,hour,Find1(st3,st4)))

注:
本题为PAT (Basic Level) Practice 1014题。并没有涉及复杂的算法,但在审题上需要特别仔细:
①两个用于搜索的字符串并不等长,但是是一位一位比,所以要考虑循环终止的条件,避免下标访问越界。
②先通过str1,str2来求星期几,需要满足字符相同且为大写字母,更重要的是注意到还要满足A~G与星期的一一对应关系,不能超出这个范围,否则就表示不出星期几了
③确定星期几以后,再继续往下搜索,确定小时。这里也是通过后边的对应关系来“推测”条件。根据“一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示”,可以得出,要满足字符相等,或者是0~9的数字,或者是A-N(对应10-23小时)的大写字母。所以相等的小写字母是不可以的。这是对“第 2 对相同的字符”的理解。求出小时数以后即可退出循环。
④小时数、分钟数都要格式化为两位整数,高位用0填满。

另外,在PAT的评测系统中,若提交结果为“非零返回”,要特别注意程序在运行时是否发生了异常,比如下标访问过界、一些方法调用返回的异常等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值