1014 福尔摩斯的约会

1014 福尔摩斯的约会 (20 分)

题意描述:

大侦探福尔摩斯接到一张奇怪的字条:
我们约会吧!
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 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。

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

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

输入样例:

3485djDkxh4hhGE 
2984akDfkkkkggEdsb 
s&hgsfdk 
d&Hyscvnm

输出样例:

THU 14:04

解题思路:

根据题意,本题的实质是在两个字符串中寻找相同位置上出现的相同字符。只是需要多读一下题目,妥善地处理有点多的限制条件。


代码:

def main():
    data = []
    # 用来存储输入的2组,4个字符串。
    count = 0
    day = 0
    hour = 0
    mini = 0
    # 以上三个变量分别用来存储约会时间在一周的 第几天,在那一天的第几个小时,在那个小时的第几个分钟 
    days = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
    # 存储一周7天的简称,这样我们可以通过days[day]直接获取在一周的某天对应的简称
    for x in range(4):
        data.append(input())
        # 接收输入的四个字符串
    for x in range(len(data[0])):
        # 对第一组字符串,注意虽然 x 看起来只是在遍历第一个字符串但实际上我们用它来访问第一组字符串。
        # 由于题目保证有答案,所以如果 len(data[0] > len(data[1])) 在访问到越界的data[1][x] 之前
        #就会找到答案然后终止循环。所以这样写并不会产生数组越界的问题。
        if data[0][x] == data[1][x]:
            # 如果在相同的位置找到了相同的字符,判断表示的是星期几还是小时数或者什么也不是。
            if isUpper(data[0][x]) and count == 0 and ord(data[0][x]) <= ord('G'):
                # 是大写字母[A-Z] 并且 第一次出现,而且 是[A-G]
                # 注意这里A-G分别对应星期一到星期天,题目中并没有直接给出:)。
                day = days[ord(data[0][x]) - ord('A')]
                # 求出对应的是一周的第几天, ord()函数可以返回字符的ASCII码数值。ord('A') == 65,ord('B') == 66
                count += 1
                # 为 破解 小时数 作铺垫
            elif isNumber(data[0][x]) and count == 1:
                hour = '0' + data[0][x]
                # 如果是在10点之前(不包括10点),那就是用数字表示的。
                break
                # 记得break,因为至此第一组字符串中的信息已经破解完毕。如果没有break,可能会有后面的数组越界访问发生。
            elif isUpper(data[0][x]) and count == 1 and ord(data[0][x]) <= ord('N'):
                # 如果是在10点之后,用大写字母表示的。而且由于一天只有24个小时,所以只有[A-N]对应 [10-24]是有效的。
                # 这里题目中给出了范围
                hour = str(ord(data[0][x]) - ord('A') + 10)
                break
    for x in range(len(data[2])):
        # 对第二组字符串
        if data[2][x] == data[3][x] and isAplha(data[2][x]):
            # 如果在相同的位置上有相同的字符并且是字母
            if x < 10:
                #格式化,补上前导零
                mini = "0" + str(x)
            else:
                mini = str(x)
    print(day + " " + hour + ":" + mini)
    # 将答案拼接成字符串并输出


def isNumber(x):
    # 判断一个字符是否是数字
    if ord(x) >= ord('0') and ord(x) <= ord('9'):
        return True
    else:
        return False


def isAplha(x):
    # 判断一个字符是否是字母
    if ord(x) >= ord('a') and ord(x) <= ord('z'):
        return True
    if ord(x) >= ord('A') and ord(x) <= ord('Z'):
        return True
    return False


def isUpper(x):
    # 判断一个字符是否是大写字母
    if ord(x) >= ord('A') and ord(x) <= ord('Z'):
        return True
    return False

if __name__ == '__main__':
    main()


易错点:

  • 题目中隐藏了星期-到星期天对应的大写字母范围[A-G]。
  • 根据描述,要现求解出星期几再求解小时数。
  • 注意小时数和分钟数小于10的时候需要补上前导零。
  • 判断字符是否是字母,数字,大写字母最好写成单独的函数。

总结:

  • Python中的ord()函数返回传入的字符对应的ASCII码数值,ord(‘a’) == 97。
  • Python中的chr()函数返回传入的ASCII码数值对应的字符,chr(97) == ‘a’。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值