替换所有的问号
给你一个仅包含小写英文字母和 '?' 字符的字符串 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 个字母,只需按优先级选字符即可,核心逻辑为:
- 先尝试选
a:如果a不等于前一个字符、也不等于后一个字符,就用a;- 若
a不行,尝试选b:如果b满足条件,就用b;- 若
a和b都不行,选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
