洛谷 P1098 [NOIP2007 提高组] 字符串的展开 Python题解

p1, p2, p3 = map(int, input().split())
strr = input()
"""
    p1 - 1 填充小写 -2 填充大写 -3 填充p2对应数字的星号
    p2 - 填充的字符数
    p3 - 1 原来顺序 -2 填充的逆序输出
    如果中间没有间隔则直接删除减号 
    如果右边小于左边则不变
    当‘-’两端的字符分别是数字和字母时,原样输出。
    字符串首尾的‘-’需要原样输出。
    连续的‘-’需要原样输出。
"""
res = ''
for i in range(len(strr)):
    if strr[i] != "-":
        res += strr[i]
    else:
        if ord(strr[i - 1]) >= ord(strr[i + 1]) or i == 0 or i == len(strr) - 1 or strr[i + 1] == "-" \
                or strr[i - 1] == "-" or ("0" <= strr[i - 1] <= "9" and "a" <= strr[i + 1] <= "z"):
            # 首位是"-"、左边是数字右边是字母、连续多个"-"、左边的大于右边的(假如右边是数字左边是字母也符合这条件)、 原样输出即可
            res += strr[i]
            continue
        if ord(strr[i + 1]) - ord(strr[i - 1]) == 1:
            continue
        cou = ord(strr[i + 1]) - ord(strr[i - 1])
        if "a" <= strr[i - 1] <= "z":  # 如果要是字母
            if p1 == 1 and p3 == 1:
                for j in range(1, cou):
                    res += p2 * chr(ord(strr[i - 1]) + j)
            if p1 == 1 and p3 == 2:
                for j in range(cou - 1, 0, -1):
                    res += p2 * chr(ord(strr[i - 1]) + j)
            if p1 == 2 and p3 == 1:
                for j in range(1, cou):
                    res += p2 * chr(ord(strr[i - 1]) - 32 + j)
            if p1 == 2 and p3 == 2:
                for j in range(cou - 1, 0, -1):
                    res += p2 * chr(ord(strr[i - 1]) - 32 + j)
        if "0" <= strr[i - 1] <= "9":  # 如果要是数字 数字是不区分大小写的
            if p3 == 1 and p1 != 3:
                for j in range(1, cou):
                    res += p2 * chr(ord(strr[i - 1]) + j)
            if p3 == 2 and p1 != 3:
                for j in range(cou - 1, 0, -1):
                    res += p2 * chr(ord(strr[i - 1]) + j)
        if p1 == 3:  # "*"随便输出
            for j in range(1, cou):
                res += p2 * '*'
print(res)

其实对于洛谷题单算法1-1模拟与高精度来说所有题目都不算难,主要是看你能不能理解什么叫模拟,什么叫高精度,理解了之后只不过就是代码翻译的过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值