python第二周刷题

这次的刷题被上周的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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值