蓝桥杯Python初级测试题之省赛题2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zeng31403

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

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

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

打赏作者

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

抵扣说明:

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

余额充值