赞
踩
做小题的时候,主要目标是找如何做的又快又准。
做完这些题,最大的感觉是,题目虽然不难,但是很多坑(很大可能是自己基础太差了(ಥ_ಥ) )
(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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。