蓝桥杯Python初级测试题之省赛题2
1. 数字
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 1 拼到多少。 例如,当小蓝有 30 张卡片,其中 0 到 9 各 3张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。 现在小蓝手里有 0到 9的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少? 提示:建议使用计算机编程解决问题
答题思路:
(1)用一个变量n从1开始不断自增,并且转换为字符串str_n
(2)一个变量数组str_num = "0123456789"保存0-9字符,用list_times09数组保存0-9出现的次数
(3)循环中str_n查找出现的0-9的次数,并将次数累加到list_times09数组对应的位置上
(4)判断是否等于2021,等于时的n即答案。
n = 1
n_str = ""
# 保存从0-9每个数字出现的次数
find_n = False
str_num = "0123456789"
list_times09 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# 设置一个自增数字 转为字符串,统计0到9出现的次数,大于2021则用完
while not find_n:
n_str=str(n)
for i in range(len(str_num)):
ni=n_str.count(str_num[i])
if ni>0:
list_times09[i] += ni
if list_times09[i] >= n09:
find_n = True
print(n)
break
n += 1
2. 年号字串
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明用字母 A对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对应 28,AZ 对应 52,LQ 对应 329。
请问 2019 对应的字符串是什么?
答题思路:
(1)相当于10进制转26进制,但是不同的是十进制用字母0-9表达1-10,而26进制用字母A-Z表达1-26
(2)用一个数例如1234每次除以进制进行拆解,比如进制=10,除进制四次的余数分别为4/3/2/1倒过来就是1234
(3)余数为0的情况需要前面减1,本位置0变为26,这个比较难办,判断余数是否为0处理。
(3)余数为0 商为1则本位置直接变为26 不用前1位借;余数为0,商大于1小于等于26,则本位变为26前面借1位;
余数为0,商>26则本位变26之后,前面减1可继续循环;其它情况都是直接记录余数
(4)将记录的数组倒过来就是进制数,按照字母A-Z进行翻译(ASCII)就得到了字符串。
n =2019
jinzhi =26
list_n = []
# 这是一个进制转换,像十进制一样,不断除以10进行拆解就得到每个位上的数字
# 1234除以10得余数为4,剩余数为(1234-4)/10;不断重复可以得到倒置的整个数组
x = n
while True:
# x代表循环数 yushu为余数 商为shang 进制为jinzhi
# 如1234/10=商123 余数为4
# 12/10 商1 余2 9/10 商0 余9
# 10/10 商1 余0 150/10 15 0
# 如果商为0则停止计算 不为0则将商变为下一个x,余数放到数组中持续循环
shang = int(x / jinzhi)
yushu = x % jinzhi
if shang == 0:
list_n.append(yushu)
break
elif yushu == 0:
list_n.append(jinzhi)
if 1 < shang <= jinzhi:
list_n.append(shang - 1)
break
else:
shang -= 1
x = shang
else:
list_n.append(yushu)
x = shang
list_n = list_n[::-1]
list_str26 = [chr(ord('A') + x - 1) for x in list_n]
str_code = ''.join(list_str26)
print(str_code)
#BYQ
3. 奇数倍数
题目描述:本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
请你找到最小的整数 X 同时满足:
X 是 2019 的整倍数;
X 的每一位数字都是奇数。
答题思路:
(1)采用自增while循环找数(自增数x),由于是2019倍数,因此起始为2019,每次增加2019
(2)将自增变量x转化为字符串,全部奇数all_jisu为True,依次验证每个字符对应数字,有1个为偶数立即判断为False并跳出循环
(3)如果all_jisu仍然为True则找到需要的最小数,跳出循环并输出该数字。
x = 2019
while True:
str_x = str(x)
all_jisu = True
for t in str_x:
if int(t) % 2 == 0:
all_jisu = False
break
if all_jisu:
print(x)
break
x += 2019
4. 删除字符
给定一个单词,请问在单词中删除 t 个字母后,能得到的字典序最小的单词是什么?
输入的第一行包含一个单词,由大写英文字母组成。
第二行包含一个正整数 t。其中,单词长度不超过 100,t 小于单词长度。
输出描述:输出一个单词,表示答案。
输入输出样例
示例 1
输入 LANQIAO 3
输出 AIAO
答题思路:
(1)有n次删除机会,则做n次大循环每次删除一个字符
(2)每次删除时,前面字符小比如A,后面B是正常的,符合字典序,但如果前面B后面A就不符合,将B删除,依次查找删除即可。
str1 = input("请输入字符串:")
n = int(input("请输入删除个数:"))
if n >= len(str1):
exit()
while n > 0:
s = [x for x in str1]
del_ch = False
# 只剩最后一个字符时不用比,因此次数从len(s)-1减少为len(s)-2
for i in range(len(s)-2):
c = s[i]
# 前面字符小比如A,后面B是正常的;否则如果s[i+1]<s[i]后面比前面小不正常,删除前面的的大字母
if s[i + 1] < s[i] and not del_ch:
s.remove(s[i])
str1 = "".join(s)
n -= 1
del_ch = True
print(str1)
# AIAO