1. 公司的logo

输出题: 观察规律(我一般观察规律时间比较慢,所以做的时间很长,做了20分钟)

首先我们可以观察题目一共有三种不同类型的字符串

以0为例:

第一行:### ### ###

第二行:# # # #

第四行:# # # # #

第一行的规律就是每次加一个#

第二行的规律就是中间前两个#中间每次多加上一共#,后面每次多加上2个空格,第一次是5,第二次是7,规律2*n+5

第四行的规律就是前中后每次加上一个空格

最后t1,t2,t3三种字符串输出的时候,

先输出t1 ,中间输出n+1行t2,再输出t1和n+1行t2,最后输出t1

下面是非常丑陋拼接字符串的代码:

n = int(input())
s = ["### ### ###","# # #     #"]
t1 = ""
for i  in range(n+3):
    t1 += "#"
t1 +=" "
for i in range(n+3):
    t1 += "#"
t1 += " "
for i in range(n+3):
    t1 += "#"
t2 = "#"
for i in range(n+1):
    t2 += " "
t2 += "# #"
#  5 7
for i in range(2 * n + 5):
    t2 += " "
t2 += "#"
t3 = "#"
for i in range(n+1):
    t3 += " "
t3 +="# #"
for i in range(n+1):
    t3 += " "
t3 += "#"
for i in range(n+3):
    t3 += " "
t3 += "#"
print(t1)
for i in range(n+1):
    print(t2)
print(t1)
for i in range(n+1):
    print(t3)
print(t1)
2. 解封日期

利用py的datetime库,进行日期的加减

中间题目有一个没有说明的点,导致wa了一发(默认m+1天前是有新增病例的,题目没说

贪心思路: 因为从今天开始统计到m天前,所以一旦这段时间内出现过病例,就延迟到当时的日期 + n天后,

用下方表格加以说明一下:

日期

2004/10/26

2004/10/27

2004/10/28

出现病例数

未知,肯定出现过

0

1

是否出现病例

True

False

True

最早解封时间

2004/10/30

2004/10/30

2004/11/01

由于题目输入是从右==> 左输入的,所以最早解封时间取决于最近出现病例的一天,加上推迟的n天

一旦出现病例后标记flag为True,后面的输入就不需要进行处理了

如果m天内都没有出现过,默认m+1天前是最近出现病例的

from datetime import datetime, timedelta
t = input()
n,m = map(int,input().split())
# 记录结果
res = ""
# 标记今天-m天前是否出现过病例
flag = False
for i in range(m):
    # 字符串转换为时间
    d1 = datetime.strptime(t, '%Y/%m/%d')
    s = int(input())
    if flag:
        continue
    if s != 0:
        # 时间间隔 -i + n 即可
        res = d1 - timedelta(days=i) + timedelta(days = n)
        flag = True
if not flag:
    res = d1 - timedelta(days=m) + timedelta(days = n)
print(res.strftime('%Y/%m/%d'),end="")
3. 语音设备是否正常

思路统计除了房主外的n行内,每个角色是否说过话,如果说过话,就从集合或者字典中清除该项

最后的集合或者字典内如果是空的话,就说明每个人都说过话,就输出ready

否则将集合或者字典内的元素加入到一个列表,根据字典序排序后输出

set集合版本

# 预处理工作
s = set()
t = ["Captain","Priest","Cook","Doctor","Engineer","Hunter","Gunner","Navigator"]
for i in range(len(t)):
    s.add(t[i])
# 输入房主名称
owner = input()
# 移除房主名称
s.remove(owner)
n = int(input())
for i in range(n):
    m = input()
    # 根据:分割字符串,第一项绝对是人名
    s1 = m.split(":")
    # 判断是否在集合内,如果在,就移除该项
    if s1[0] in s:
        s.remove(s1[0])
# 如果是集合为空,则证明里面的人的设备全部正常
if len(s) == 0:
    print("Ready",end="")
else:
    # 处理设备不正常的,并通过字典序输出
    res = []
    for role in s:
        res.append(role)
    res.sort()
    for i in range(len(res)):
        if i != len(res)-1:
            print(res[i])
        else:
            print(res[i],end="")

dict字典版本:

# 预处理工作
s = {"Captain":0,
"Priest":0,
"Cook":0,
"Doctor":0,
"Engineer":0,
"Hunter":0,
"Gunner":0,
"Navigator":0}
# 输入房主名称
owner = input()
# 移除房主名称
del s[owner]
n = int(input())
for i in range(n):
    m = input()
    # 根据:分割字符串,第一项绝对是人名
    s1 = m.split(":")
    # 判断是否在字典内,如果在,就移除该项
    if s1[0] in s:
        del s[s1[0]]
# 如果是字典为空,则证明里面的人的设备全部正常
if len(s) == 0:
    print("Ready",end="")
else:
    # 处理设备不正常的,并通过字典序输出
    res = []
    for role in s:
        res.append(role)
    res.sort()
    for i in range(len(res)):
        if i != len(res)-1:
            print(res[i])
        else:
            print(res[i],end="")