这次的刷题被上周的PCTF耽误了
1.成绩分析
https://www.lanqiao.cn/problems/497/learning/
n = int(input(''))
i = 0
list1 = []
while i < n:
list1.append(int(input('')))
i += 1
print(max(list1))
print(min(list1))
print('%.2f'%(sum(list1)/n))
2.合法日期
https://www.lanqiao.cn/problems/541/learning/
import datetime
m=int(input())
d=int(input())
try:
a=datetime.date(2021,m,d)
print('yes')
except:
print('no')
利用try-except处理异常
3.时间加法
https://www.lanqiao.cn/problems/548/learning/
import datetime
now_time = datetime.datetime(1000, 10, 5, hour=int(input()), minute=int(input()))
minuct_time = datetime.timedelta(minutes=1)
time = now_time + minuct_time * int(input())
print(time.hour)
print(time.minute)
***4.扫雷
https://www.lanqiao.cn/problems/549/learning/
#大体思想是开两个数组,一个放输入的样例 一个放vis标记数组,然后遍历样例,如果碰到雷,就在标记数组把这个位置标为9.然后把这个位置相邻的八个位置+1 由于不是雷的位置周围最多有八个雷,所以那些位置标记不会超过8 不会和9冲突
n,m = map(int,input().split())
tu = []#用来存输入
for i in range(n):#存进去
tu.append(list(map(int,input().split())))
vis = [[0 for j in range(m)]for i in range(n)]#写一个与tu行数和列数都一样的标记数组
dir = [(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)]#写一个方向数组
for i in range(n):#遍历整个tu
for j in range(m):
if tu[i][j]==1:#如果这个位置是有雷
vis[i][j]=9#就将标记数组标记为9
for x in dir:#然后对周围八个位置进行检查遍历
xi = i +x[0]
xj = j +x[1]
if 0<=xi<=n-1 and 0<=xj<=m-1:#筛选八个位置中不出界的位置
if vis[xi][xj]!=9:#如果这个位置不是9
vis[xi][xj]+=1#就将这个位置+1 表示周围有一个雷了
#位置上的数会不断累加,而且最多不会超过8 因为最多只有周围八个有雷 所以vis标记的9和这个不会冲突
for i in range(n):#循环遍历输出
for j in range(m):
print(vis[i][j],end=' ')
print()
方向向量的知识在这里很重要
5.大写
https://www.lanqiao.cn/problems/1590/learning/
m = input('')
print(m.upper())
6.标题统计
https://www.lanqiao.cn/problems/325/learning/
str1 = list(input(''))
total = len(str1)
for i in str1:
if i == ' ' or i =='\n':
total -= 1
print(total)
7.求和
https://www.lanqiao.cn/problems/1442/learning/
total = 0
for i in range(1,2020):
j = str(i)
if '2' in j or '0' in j or '1' in j or '9' in j :
total+=i
print(total)
8.天数
https://www.lanqiao.cn/problems/542/learning/
import datetime
month = int(input(''))
if month ==12:
print(31)
else:
s1 = datetime.date(2021,month,1)
s2 = datetime.date(2021,month+1,1)
print((s2-s1).days)
垃圾代码
import calendar
m = int(input())
print(calendar.monthrange(2021,m)[1])
calendar库,学!!!
9.最大间隙
https://www.lanqiao.cn/problems/543/learning/
n = int(input(''))
list1= list(map(int,input('').split()))
max1 = 0
for i in range(n-1):
res = list1[i+1] - list1[i]
if res > max1 :
max1 = res
print(max1)
10.金币
https://www.lanqiao.cn/problems/357/learning/
K = int(input(''))
day = 0
coin = 0
for i in range(1,K+1):
for j in range(1,i+1):
coin += i
day += 1
if day == K:
print(coin)
break
if day == K:
break
11.天干地支
https://www.lanqiao.cn/problems/1029/learning/
tian=['jia','yi','bing','ding','wu','ji','geng','xin','ren','gui']
di=['zi','chou','yin','mao','chen','si','wu','wei','shen','you','xu','hai']
year = int(input())
year -= 64
t = year%10
d = year%12
print(tian[t]+di[d])
找到一个甲子年为基准年,如2004年或1964年为甲子年,再用输入的年份减去基准年就相当于从0开始的循环啦
12.明明的随机数
https://www.lanqiao.cn/problems/539/learning/
N = int(input(''))
list1 = []
list2 = []
str1 = input().split()
list1 = [int(i) for i in str1]
for j in list1:
if j not in list2:
list2.append(j)
list2 = sorted(list2)
print(len(list2))
for i in list2:
print(i,end=' ')
n = int(input())
nums = set(map(int, input().split()))
nums = sorted(nums)
print(len(nums))
print(" ".join(map(str, nums)))
这代码比我的简洁多了
13.灌溉
https://www.lanqiao.cn/problems/551/learning/
这题有点难,看答案有同学是用栈的知识去做的,我等学过之后,再过来看看
14.特殊日期
https://www.lanqiao.cn/problems/2408/learning/
import datetime
days = datetime.date(1900, 1, 1)
b=datetime.date(9999, 12, 31)
j = 0
while True:
year = days.year
month = days.month
day = days.day
list1 = [int(i) for i in str(year)]
total1 = sum(list1)
list2 = [int(i) for i in str(month)]
list3 = [int(i) for i in str(day)]
total2 = sum(list2) + sum(list3)
if total1 == total2:
j += 1
days += datetime.timedelta(days=1)
if days == b:
print(j)
break
结果是70910
但是代码超时了,不知道怎么做优化,但是题目是填空题,可以面向结果编程
import os
import sys
# 请在此输入您的代码
def isLeap(x): # 判断是否为闰年
if (x % 4 == 0 and x % 100 != 0) or x % 400 == 0:
return True
return False
def numAdd(x): # 计算年份个数位的数字和
sums = 0
while x:
sums += x % 10
x //= 10
return sums
start, end = 1900, 9999
ans = 0
day = [1, -2, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1] # 每个月天数和30天的差值
data = []
hstable = dict() # key:月份1~12,value:每个月份月份数位和+日的数位和的区间,如1月份为(2, 32)
for j in range(1,32): # 计算日数位和
data.append(numAdd(j))
for i in range(1, 13): # 初始化哈希表
t = numAdd(i) # 月数位和
for j in range(day[i - 1] + 30): # 遍历一个月的每一天将月数位和加上日数位和
addt = t + data[j]
if addt not in hstable:
hstable[addt] = 1
else:
hstable[addt] += 1 # 哈希表中对应的天数加一
for i in range(start, end + 1): # 遍历每一年
yearsum = numAdd(i) # 计算年的数位和
if yearsum in hstable: # 若年的数位和在哈希表中存在则答案加上对应的天数
ans += hstable[yearsum]
if isLeap(i) and yearsum == 13: # 闰年2月份多一天,位数和为13
ans += 1
print(ans)
大佬的解法,大佬说的一句话我觉得也很有道理
但是,我现在是菜鸟,基本库的使用都还不会,等掌握了,确实得学学这种方法进阶
时间优化结果非常明显
15.最大距离
https://www.lanqiao.cn/problems/155/learning/
n = int(input())
s = list(map(int,input().split()))
max_num = 0
for i in range(n-1):
for j in range(i+1,n):
max_num = max(max_num,abs(j-i)+abs(s[j]-s[i]))
print(max_num)
16.最长递增
https://www.lanqiao.cn/problems/158/learning/
n = int(input())
s = list(map(int,input().split()))
max_num = 0
num = 0
for j in range(1,n):
if s[j]>s[j-1]:
num+=1
max_num = max(max_num,num)
elif s[j]<s[j-1]:
max_num = max(max_num,num)
num = 1
else:
max_num = max(max_num,num)
num = 0
print(max_num)
大于等于小于三种情况要分开讨论,num的初始赋值也不同
n = int(input())
a = list(map(int,input().split()))
list1 = []
for i in range(n):
count = 1
for j in range(i + 1, n):
if a[j] > a[j - 1]:
count += 1
elif a[j] < a[j - 1] :
list1.append(count)
break
print(max(list1))
17.串的处理
https://www.lanqiao.cn/problems/287/learning/
优质代码
s = input().split()
l_new = []
for i in s:
i = list(i) #每个单词转换成list类型
new=""
#len(i)-1防止越界访问,后面会加上的
for j in range(len(i)-1):
new+=i[j] #new拼接到字符串字符的倒数第二位
#1.前一位是数字,后一位是字母
if i[j].isdigit() and i[j+1].isalpha():
new+='_'
#2.前一位是字母,后一位是数字
if i[j].isalpha() and i[j+1].isdigit():
new+='_'
#在这里加上了
new+=i[-1]
#new到列表里
l_new.append(new)
s_new = " ".join([i[0].upper()+i[1:] for i in l_new])
print(s_new)
18.幸运数字
https://www.lanqiao.cn/problems/3499/learning
def is_bin(i):
num = bin(i)
num_list = list(map(int,num[2:]))
if i % sum(num_list) == 0:
return True
return False
def is_oct(i):
num = oct(i)
num_list = list(map(int,num[2:]))
if i % sum(num_list) == 0:
return True
return False
def is_dec(i):
num = str(i)
num_list = list(map(int,num))
if i % sum(num_list) == 0:
return True
return False
def is_hex(i):
dict1 = {'a':10,'b':11,'c':12,'d':13,'e':14,'f':15}
num = hex(i)
num_list = list(num[2:])
sum1 = 0
for j in num_list:
if j in dict1:
sum1+=dict1[j]
else:
sum1+=int(j)
if i % sum1 == 0:
return True
return False
total = 0
for i in range(1,500000):
if is_bin(i) and is_oct(i) and is_dec(i) and is_hex(i):
total += 1
if total == 2023:
break
print(i)
看了别人的题解,发现我的答案还算可以
19.缩位求和
https://www.lanqiao.cn/problems/181/learning/
num = input()
while True:
list1 = list(map(int,num))
num = sum(list1)
if num<10:
break
num = str(num)
print(num)
20.ISBN号码
https://www.lanqiao.cn/problems/523/learning/
str1 = input('').split('-')
new=''
total=0
for i in range(3):
new+=str1[i]
l_new=list(new)
for j in range(1,10):
total+=int(l_new[j-1])*j
key = total%11
if ( key== 10 and str1[-1] == 'X') or key == int(str1[-1]):
print("Right")
elif key == 10:
str1[-1] = 'X'
print('-'.join(str1))
else:
str1[-1]=str(key)
print('-'.join(str1))
k
num = str(num)
print(num)
20.ISBN号码
https://www.lanqiao.cn/problems/523/learning/
str1 = input('').split('-')
new=''
total=0
for i in range(3):
new+=str1[i]
l_new=list(new)
for j in range(1,10):
total+=int(l_new[j-1])*j
key = total%11
if ( key== 10 and str1[-1] == 'X') or key == int(str1[-1]):
print("Right")
elif key == 10:
str1[-1] = 'X'
print('-'.join(str1))
else:
str1[-1]=str(key)
print('-'.join(str1))