Python蓝桥杯常考知识点-模拟

替换所有的问号

给你一个仅包含小写英文字母和 '?' 字符的字符串 s,请你将所有的 '?' 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。
注意:你 不能 修改非 '?' 字符。
题目测试用例保证 除 '?' 字符 之外,不存在连续重复的字符。
在完成所有转换(可能无需转换)后返回最终的字符串。如果有多个解决方案,请返回其中
任何一个。可以证明,在给定的约束条件下,答案总是存在的。
示例 1:
输入:s = "?zs"输出:"azs"解释:该示例共有 25 种解决方案,从 "azs" 到 "yzs" 都是符合
题目要求的。只有 "z" 是无效的修改,因为字符串 "zzs" 中有连续重复的两个 'z' 。
示例 2:
输入:s = "ubv?w"输出:"ubvaw"解释:该示例共有 24 种解决方案,只有替换成 "v" 和 "w"
不符合题目要求。因为 "ubvvw" 和 "ubvww" 都包含连续重复的字符。

python 复制代码
#读取输入的字符串
s=input().strip()
#查找前后是否有一样的,根据?的位置来划分
for i in range (len(s)):
    if s[i]=='?':#处理?字符
        if i ==0: #问号在开头
            s=('b' if i+1 <len(s) and s[i+1]=='a' else'a')+s[i+1:]
        elif i==len(s)-1: #处理字符串结尾的问号
            s=s[:i]+('b'if s[i-1]=='a'else'a')
        else:#?在中间
            prev=s[i-1]
            next_char=s[i+1]
            if (prev=='a'and next_char=='b')or(prev=='b'and next_char=='a'):
              replacement='c'
            elif (prev=='a'and next_char!='b')or(prev!='b'and next_char=='a'):
                replacement='b'
            else:
                replacement='a'
            s=s[:i]+replacement+s[i+1:]
#输出
print(s)

1.字符串根据位置切片

2.通过检查前后字符是否重复来判断,先赋初值假设,然后来判断。

不用复杂判断,也不用遍历所有 26 个字母,只需按优先级选字符即可,核心逻辑为:

  1. 先尝试选a:如果a不等于前一个字符、也不等于后一个字符,就用a
  2. a不行,尝试选b:如果b满足条件,就用b
  3. ab都不行,选c(必然满足,因为最多只需要避开 2 个字符)。

GO shopping

最近 Awell 的运气特别好,这不,他在路边摊买彩票,居然中了大奖。秉着见者有份的原
则,他准备请咱们学校ACM-ICPC 训练基地的全体队员逛商场。
赶巧交大旁边有一家商场新店开张,正在进行打折促销活动。于是,咱们所有队员都在商场中大肆购买之后,在收银台前排起了长队。
话说回来,这家商场的打折方式有些奇怪:他们从在收银台前付账的所有****n 位顾客中,所有的第 mm 的倍数名顾客享受七五折优惠,其余顾客只能享受九五折。为了方便付账,Awell 拜托老板将付账者的姓名和付款金额打印出来,作为参考。
你需要注意的是,在收银台前长长的队伍中,有的可不止是 ACM 队员,同样,还有很多交大的同学慕名前来消费,为了区分他们,我们规定,所有 ACM****队员必须在姓名前加上前缀 ACM。
现在,请机智的你为 Awell 编写一个小程序,算一算他
总共需要花费多少钱呢?

输入格式
输入数据包含不超过 5 组,每组第一行有两个整数****n,m(1≤n,m≤1000),分别代表着在收银台
前队伍的全部人数 ,以及商家将会选择每第****m 位顾客打 7.5
接下来有n ,每行将会输入消费者的姓名(长度不超过 20 个字符),以及他们各自消费
的金额(消费金额不超过 1000)。
输出格式
每组数据输出一行 ,每行一个实数,表示Awell 总共需要花费多少
你应该注意的是,老板只收取"角"作为最小单位,而且他是一个锱铢必较的人,所以,如果
所付金额中存在小于****0.1 元的部分,那就至少要付 0.1 元给他(想着即将消瘦的钱包,Awell泪目中)。

python 复制代码
# 无限循环,用于持续读取多组输入,直到输入结束(EOF)
while True:
    try:
        # 读取每组输入的第一行,拆分出两个整数n和m
        # n:收银台队伍的总人数;m:每第m位ACM队员享受75折
        n, m = map(int, input().split())
        
        # 初始化总花费为浮点数0.0
        ans = 0.0
        
        # 遍历每位顾客(序号从1开始,因为题目中是"第m位",序号从1计数)
        for i in range(1, n + 1):
            # 读取当前顾客的姓名和消费金额,拆分字符串
            people, money_str = input().split()
            # 将金额字符串转换为浮点数,用于后续计算
            money = float(money_str)
            
            # 判断当前顾客是否是ACM队员(姓名以"ACM"开头)
            if people.startswith("ACM"):
                # 检查是否是第m的倍数位顾客(i是当前顾客的序号)
                if i % m == 0:
                    # 第m倍数位ACM队员:75折,金额×0.75后累加到总花费
                    ans += money * 0.75
                else:
                    # 非m倍数位ACM队员:95折,金额×0.95后累加到总花费
                    ans += money * 0.95
            else:
                # 非ACM队员:无折扣,金额直接累加到总花费
                ans += money
        
        # 手动实现四舍五入到1位小数(角)的逻辑
        # 步骤1:将总金额放大10倍,减去其整数部分,得到小数部分temp
        # 例如:ans=15.525 → ans*10=155.25 → int(155.25)=155 → temp=0.25
        temp = ans * 10 - int(ans * 10)
        
        # 步骤2:判断小数部分是否大于0.5,决定是否进1
        if temp > 0.5:
            # 小数部分>0.5:进1,放大后的整数部分+1后再缩小10倍
            ans = (int(ans * 10) + 1) / 10
        else:
            # 小数部分≤0.5:舍去,直接用放大后的整数部分缩小10倍
            ans = int(ans * 10) / 10
        
        # 格式化输出总花费,保留1位小数(符合题目输出格式要求)
        print("{:.1f}".format(ans))
    
    # 捕获EOFError异常(输入结束,比如控制台按Ctrl+D/Ctrl+Z)
    except EOFError:
        # 输入结束,跳出无限循环,程序终止
        break
相关推荐
曲幽5 小时前
数据库实战:FastAPI + SQLAlchemy 2.0 + Alembic 从零搭建,踩坑实录
python·fastapi·web·sqlalchemy·db·asyncio·alembic
用户83562907805110 小时前
Python 实现 PowerPoint 形状动画设置
后端·python
ponponon11 小时前
时代的眼泪,nameko 和 eventlet 停止维护后的项目自救,升级和替代之路
python
Flittly11 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(5)Skills (技能加载)
python·agent
敏编程11 小时前
一天一个Python库:pyarrow - 大规模数据处理的利器
python
Flittly13 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(4)Subagents (子智能体)
python·agent
明月_清风20 小时前
Python 装饰器前传:如果不懂“闭包”,你只是在复刻代码
后端·python
明月_清风20 小时前
打破“死亡环联”:深挖 Python 分代回收与垃圾回收(GC)机制
后端·python
ZhengEnCi2 天前
08c. 检索算法与策略-混合检索
后端·python·算法
明月_清风2 天前
Python 内存手术刀:sys.getrefcount 与引用计数的生死时速
后端·python