蓝桥杯(python)学习刷题记录

蓝桥杯学刷题记录

2022.15.8

第一题-单词分析

题目:

题目描述:小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。
输入描述:输入一行包含一个单词,单词只由小写英文字母组成。对于所有的评测用例,输入的单词长度不超过 1000。
输出描述:输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数

答案
import os
import sys
# 请在此输入您的代码
word=input()
a=0
b=[]
for i in word:
    c=word.count(i)
    if c>=a:
        a=c
for j in word:
    if word.count(j)==a:
        b.append(j)
b.sort()
print(b[0])
print(a)

第二题-成绩统计

题目:

题目描述:小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
输入描述:输入的第一行包含一个整数 n (1≤n≤10 4),表示考试人数。接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
输出描述:输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数

答案
import os
import sys
n=int(input())
jigshu=0
youxs=0
for i in range(n):
    a=int(input())
    if 0<=a<=100:
        if 60<=a:
            jigshu+=1
            if 85<=a:
                youxs+=1
print('{:.0%}'.format(jigshu/n))
print('{:.0%}'.format(youxs/n))

第三题-最短路

题目:本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。如下图所示,GG 是一个无向图,其中蓝色边的长度是 11、橘色边的长度是 22、绿色边的长度是 33。

则从 AA 到 SS 的最短距离是多少?

答案
import os
import sys

# 请在此输入您的代码

# 录入路线图
r_list = [
    ["A", "E", 1],
    ["A", "B", 2],
    ["A", "C", 1],
    ["A", "D", 1],
    ["A", "E", 1],
    ["B", "G", 1],
    ["B", "J", 2],
    ["C", "D", 3],
    ["C", "G", 3],
    ["C", "F", 3],
    ["D", "G", 2],
    ["D", "H", 1],
    ["D", "I", 2],
    ["E", "H", 1],
    ["E", "I", 3],
    ["F", "J", 1],
    ["F", "G", 1],
    ["G", "K", 2],
    ["G", "I", 3],
    ["H", "L", 2],
    ["H", "I", 1],
    ["I", "M", 3],
    ["J", "S", 2],
    ["K", "N", 1],
    ["K", "L", 3],
    ["L", "R", 1],
    ["L", "M", 1],
    ["M", "N", 2],
    ["M", "Q", 1],
    ["M", "S", 1],
    ["N", "P", 1],
    ["Q", "O", 1],
    ["O", "R", 3],
    ["P", "O", 1],
    ["R", "S", 1],
]

# 所有路线
nums = []

# 递归
def get(num, r):
    for x, y in enumerate(r_list):

        # 上一个点与当前点一致
        if y[0] == r[1]:

            # 累计长度
            num += y[2]

            # 直到S才结束
            if y[1] == "S":
                nums.append(num)
            # 否则继续
            else:
                get(num=num, r=y)

for q, w in enumerate(r_list):
    n = 0
    # 从A开始
    if w[0] == "A":
        get(num=w[2], r=w)

# 取最小值
print(min(nums))

学习总结

count()函数

描述:统计在字符串/列表/元组中某个字符出现的次数,可以设置起始位置或结束位置。
用法:str.count(“字符串/列表/元组”, start,end)或str.count(“字符串/列表/元组”)
说明:Str-要统计的字符(可以是单字符,也可以是多字符)
Star-索引字符串/列表/元组中某个字符的起始位置,默认参数为0
End-索引字符串/列表/元组中某个字符的结束位置,默认参数为字符串长度即len(str)
返回值:int整型

扩展:find()
检测字符串中是否包含子字符串,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中的起始位置否则返回-1。
语法:字符串序列.find(子串,开始位置的下标,结束位置的下标)
index()
检测字符串中是否包含子字符串,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中的起始位置,否则则报出异常。
语法:字符串序列.index(子串,开始位置的下标,结束位置的下标)
find()
返回字符串最后一次出现的位置,如果没有匹配项则返回-1
语法:字符串序列.rfind(子串,开始位置的下标,结束位置的下标)

'.0f ’

.0f” 表示浮点数保留0位小数输出,0可以该为其他数字。此方法只能在python3中使用
‘%.0f’也表示输出0位小数,可以同时在python2中与python3中使用

#举例
print('%.0f' %a)
print({:.0f}.format(a))
enumerate()

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
语法:enumerate(sequence, [start=0])
说明:sequence – 一个序列、迭代器或其他支持迭代对象。
start – 下标起始位置的值
返回 enumerate(枚举) 对象。

#举例
i = 0
seq = ['one', 'two', 'three']
for i,element in seq:
	print i, seq[i]
'''输出
0 one
1 two
2 three
#i可以不用
'''

2022.12.9

第四题-回文日期

2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入描述:输入包含一个八位整数 NN,表示日期。对于所有评测用例10000101≤N≤89991231,保证 NN 是一个合法日期的 8 位数表示。
输出描述:输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
####答案(通过率只有百分之40)

import os
import sys

# 请在此输入您的代码
day = int(input())
for i in range(day+1,99999999):
  i = str(i)
  if int(i[4:6])<=12 and int(i[6:])<=30:
    if str(i) == str(i)[::-1]:
      print(i)
      break
for i in range(day+1,99999999):
  i = str(i)
  if int(i[4:6])<=12 and int(i[6:])<=30:
    if i[0] == i[2] == i[5] ==i[7] and i[1] == i[3] == i[4] == i[6]:
     print(i)
     break

总结

python算数运算符
运算符作用
+
-
*
/
%取余
**幂(x**y,x的y次幂)
//取整除
拓展
关系运算符
关系运算符名称
==等于
!=不等于
>(>=)大于(大于等于)
<(<=)小于(小于等于)
逻辑运算符功能
and两个语句都为真则返回真
or两个语句有一个为真则返回真
not真则返回假,假则返回真
位运算符名称功能
&按位与有0为0无0为1
l按位或有1为1无1为0
^按位异或相同为1不同为0
~按位取反1变0,0变1
>>右移>>n:整体右移n位
<<左移<<n:整体左移n位
身份运算符功能
is两个变量位同一个变量返回真
is not两个变量不为同一个变量返回真
str()

功能:str( )函数能将int类型、float类型的数据转换成字符串类型。

扩展

字符串索引

举例意义
str[0]获取第一个元素
str[-2]获取倒数第二个元素
str[1:3]获取从偏移为1的字符一直到偏移为3的字符串,不包括偏移为3的字符串
str[1:]获取从偏移为1的字符一直到字符串的最后一个字符(包括最后一个字符)
str[:3]获取从偏移为0的字符一直到偏移为3的字符串,不包括偏移为3的字符串
str[:-1]获取从偏移为0的字符一直到最后一个字符(不包括最后一个字符串)
str[:]获取字符串从开始到结尾的所有元素
str[-3:-1]获取偏移为 -3 到偏移为 -1 的字符,不包括偏移为 -1 的字符
备注字符串索引时可设置第三个参数为步长[::2]

2022.12.12

第五题-门牌制作

题目

蓝要为一条街的住户制作门牌号。这条街一共有 2020位住户,门牌号从 1 到 2020 编号。小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

答案
import os
import sys

# 请在此输入您的代码
sum = 0
for i in range (2021):
  flag = 0
  one = i//1000
  two = (i-one*1000)//100
  three = (i-one*1000-two*100)//10
  four = i%10
  if one == 2:
    flag+=1
  if two == 2:
    flag+=1
  if three == 2:
    flag+=1
  if four == 2:
    flag+=1
  sum+=flag
print(sum)

第六题-卡片

题目

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少?

答案
import os
import sys
# 请在此输入您的代码
count = 0
i = 1
while(1):
  count+=str(i).count("1")
  i+=1
  if count==2021:
    break
print(i-1)

第七题-购物单

题目

小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。这不,大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。取款机只能提供 100100 元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。
请输出小明要从取款机上提取的金额,单位是元。

商品原价折扣
****180.9088折
****10.2565折
****56.149折
****104.659折
****100.3088折
****297.15半价
****26.7565折
****130.62半价
****240.2858折
****270.628折
****115.8788折
****247.3495折
****73.219折
****101.00半价
****79.54半价
****278.44
****199.26半价
****12.979折
****166.3078折
****125.5058折
****84.989折
****113.3568折
****166.57半价
****42.569折
****81.9095折
****131.788折
****255.8978折
****109.179折
****146.6968折
****139.3365折
****141.1678折
****154.748折
****59.428折
****85.4468折
****293.7088折
****261.7965折
****11.3088折
****268.2758折
****128.2988折
****251.038折
****208.3975折
****128.8875折
****62.069折
****225.8775折
****12.8975折
****34.2875折
****62.1658折
****129.12半价
****218.37半价
****289.698折
import os
import sys

# 请在此输入您的代码
value =[180.90,10.25,56.14,104.65,100.30,297.15,26.75,130.62,240.28,270.62,115.87,247.34,73.21,101.00,79.54,278.44,199.26,12.97,166.30,125.50,84.98,113.35,166.57,42.56,81.90,131.78,255.89,109.17,146.69,139.33,141.16,154.74,59.42,85.44,293.70,261.79,11.30,268.27,128.29,251.03,208.39,128.88,62.06,225.87,12.89,34.28,62.16,129.12,218.37,289.69]
discount=[0.88,0.65,0.9,0.9,0.88,0.5,0.65,0.5,0.58,0.8,0.88,0.95,0.9,0.5,0.5,0.7,0.5,0.9,0.78,0.58,0.9,0.68,0.5,0.9,0.95,0.8,0.78,0.9,0.68,0.65,0.78,0.8,0.8,0.68,0.88,0.65,0.88,0.58,0.88,0.8,0.75,0.75,0.9,0.75,0.75,0.75,0.58,0.5,0.5,0.8]
sum = 0
for i in range(len(value)):
  sum+=(value[i]*discount[i])
sum = int(sum)
sum = (sum//100+1)*100
print(sum)
#这个题直接计算更简单,构建列表真的很麻烦

总结

count()
#第五题
import os
import sys
# 请在此输入您的代码
b=0
for i in range (1,2021):
  a=str(i).count('2')
  b+=a
print(b)

语法格式 : str.count(sub[, start[, end]])
作用:用于检索指定字符串在另一个字符串中出现的次数,如果检索的字符串不存在则返回0,否则返回出现的次数。
参数说明 str:表示原字符串 sub:表示要检索的子字符串 start:可选参数,表示检索范围的起始位置的索引,如果不指定,则从头开始检索 end:可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾

2022.12.15

第八题-跑步锻炼

题目

小蓝每天都锻炼身体。

正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。

小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

答案
import datetime
start = datetime.date(2000, 1, 1)
end = datetime.date(2020, 10, 1)
days = datetime.timedelta(days=1)
ans = 0
while end >= start:
    if start.day == 1 or start.weekday() == 0:
        ans += 2
    else:
        ans += 1
    start += days
print(ans)

第九题- 既约分数

题目

如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?

答案
import os
import sys
import math
# 请在此输入您的代码
c = 0
for i in range(1,2021):
  for j in range(1,2021):
    if math.gcd(i,j) == 1:
      c+=1
print(c)

总结

datetime

https://blog.csdn.net/weixin_52132159/article/details/119305524?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167106998916800182760828%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=167106998916800182760828&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-119305524-null-null.142v68control,201v4add_ask,213v2t3_control1&utm_term=datetime&spm=1018.2226.3001.4187

math.gcd()

math.gcd(m,n)返回m和n的最大公约数

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

.robotor

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

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

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

打赏作者

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

抵扣说明:

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

余额充值