蓝桥杯系列5——填空题练习

心得

做小题的时候,主要目标是找如何做的又快又准。
做完这些题,最大的感觉是,题目虽然不难,但是很多坑(很大可能是自己基础太差了(ಥ_ಥ) )

题目一

(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
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Yu欸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值