心得
做小题的时候,主要目标是找如何做的又快又准。
做完这些题,最大的感觉是,题目虽然不难,但是很多坑(很大可能是自己基础太差了(ಥ_ಥ) )
题目一
(1)一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。 注意在计算时,只算本质不同的串的个数。 请问,字符串0100110001010001 有多少个不同的非空子串?
s = '0100110001010001' subs = [] for i in range(len(s)+1): for j in range(i+1, len(s)+1): if(s[i:j] not in subs): subs.append(s[i:j]) print(len(subs))
100
题目二
(2)给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。
a=[1 for _ in range(3)] print(a[0]) for i in range(3,20190324,1): # print(a[i-1]) a.append((a[i-3]+a[i-2]+a[i-1])%10000) print(a[20190323])
1 4659
总结
①一定要注意range从0开始
②列表初始化a=[1 for _ in range(3)],列表添加元素a.append(1)
题目三
(3)把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
tmp = 0 def check(n): for i in str(n): if i == '2' or i == '4': return False return True for i in range(1,2018): for j in range(i+1,2018): k = 2019-i-j if k >j and check(i) and check(j) and check(k): tmp = tmp + 1 print(tmp)
40785
def check(n): for i in str(n): if i == '2' or i == '4': print(1) return False return True print(check(2))
1 False
总结
①注意审题:各不相同的正整数
②小题尽可能准确,不要在意时间复杂度等
③注意==的比较对象,如果是字符串要交""
题目四
(4)年号字串
小明用字母 A 对应数字1,B 对应2,以此类推,用 Z 对应26。对于27以上的数字,小明用两位或更长位的字符串来对应,例如AA 对应 27,AB 对应28,AZ 对应52,LQ 对 329。
请问2019 对应的字符串是什么?
str1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' yu = [] num=2019 while num >= 26: yu.append(num%26) num = num//26 yu.append(num) print(yu) for i in yu[::-1]: print(str1[i-1],end='')
[17, 25, 2] BYQ
(5)卡片
count = 0 for i in range(10000): if count > 2019: print(i-1) break for j in str(i): if j == "1": count = count+1
3181
总结
①数字1用的最快
②注意判断和循环的先后关系
#出现次数最多的数 n = int(input()) num = list(map(int,input().split())) b = list(set(num))#化为集合,去掉相同数 b.sort()#从小到大排序 s = dict(zip(b,map(num.count,b)))#将数与它的出现次数组合再转为字典 print(s) print(max(s,key=s.get))#根据字典值选出count最大的数
6 10 1 10 20 30 20 {1: 1, 10: 2, 20: 2, 30: 1} 10
题目五
(5)数字中包含2019
n = int(input()) s = 0 for i in range(1, n + 1): a = i while a != 0: temp = a % 10 a = int(a / 10) if temp in [2, 0, 1, 9]: s += i falg = True break print(s)
40 574
n = 40 sum1 = 0 for i in range(1,n+1): for j in str(i): if j == "2" or j == "0" or j == "1" or j =="9": sum1 = sum1 + i break print(sum1)
574
题目六
(6)跑步
小明坚持每天跑步,正常情况下每天跑一公里,如果这一天是周一或者月初(每月的一号),那么小明就会跑两公里(如果这一天既是周一,又是月初,小明也是跑两公里),小明从2000年1月1日(周六)一直坚持到了2020年10月1日(周四),请你计算一下小明共跑了多少公里?
from datetime import * start = date(2000,1,1) end = date(2020,10,2) tmp = timedelta(days = 1) ans = 0 while start != end: if start.weekday() == 0 or start.day == 1: ans += 2 else: ans += 1 start = start + tmp print(ans)
8879
from datetime import * start = date(2000,1,1) end = date(2000,1,7) tmp = timedelta(days = 1) while start != end: if start.weekday() == 6: print(start,"start.weekday() == 6") if start.day == 1: print(start,"start.day == 1") start = start + tmp print(ans)
2000-01-01 start.day == 1 2000-01-02 start.weekday() == 6 6054
总结
①datetime库
②start.weekday() == 0判断是否为星期一
③start.day == 1判断是否为月初第一天
题目七
(7)矩形切割
a = 2019 b = 324 i = 0 while min(a,b)>0: if a>b: a=a-b elif b>a: b=b-a else: break i = i+1 print(i+1)
21