Python学习笔记-1-字符串插入字符

问题:
给定一个正整数 m (1<=m<5)和一个只包含数字的字符串 s (5<len(s)<=20) 使用 m 个 * 号插入到字符串中,且两个乘号不能相邻,插入后形成一个乘法算式。找出一种使乘法算式值最大的插入方式,并将结果输出。(乘号 * 不能放在字符串首尾位置)
案例:
m = 2, s = ‘123456’ 插入两个 * 号。插入的方式有:
123456=6912,123456=10488…
分析:
这道题目的关键是找出所有可插入 * 号的位置,生成不同的算式。观察题目可知,问题可转化为将 m 个元素放入 n 个盒子的问题,也就是组合问题。在Python内置库中有计算组合的函数:
from itertools import combinations
p = list(combinations(range(1,len(s)),m))
轻松得到所有可能的组合 p
p 中的每一个项目都是一种插入方式,每个项目中的元素就是字符串中插入 * 号的位置。
接下来就好办了:
首先将字符串转化为列表;
ls = list(s)
对 p 中的每一种元素进行遍历;
对列表 ls 中的每一个元素进行遍历;
如果列表 ls 中的某一个字符的索引与 p 中的元素值指示的插入点符合,在此插入 * 号。每次插入 * 号后 ls 中后边的元素相应后移,因此设置变量 k 修正插入点的变化。
for i in pos:
for j in range(len(s)):
if j == i:
ls.insert(j+k,c)
k += 1
一组插入方案完成后,将列表 ls 转回到字符串:
‘’.join(ls)
并添加到 rst 结果列表中;
在主程序中,根据 rst 结果列表生成字典 d ,d 的键是算式计算结果,值是对应的算式。
完整的程序代码如下:

# 字符串插入字符 Python 3.10.5
# by BosunOld 孙玉旭 2022、12、26
def insertChar(s,m,c):
    from itertools import combinations
    p = list(combinations(range(1,len(s)),m))
       
    def getStr(pos):
        ls = list(s)
        k = 0
        for i in pos:
            for j in range(len(s)):
                if j == i:
                    ls.insert(j+k,c)
                    k += 1
        
        return ''.join(ls)

    rst = []
    for i in p:
        sc = getStr(i)
        print(i,sc,eval(sc))
        rst.append(sc)
    return rst

if __name__ == '__main__':
    s = '6712345'
    m = 1
    if m <= len(s)-1:
        c = '*'
        d = {eval(i):i for i in insertChar(s,m,c)}
        print(max(d.keys()),d[max(d.keys())])
    else:
        print(f'输入错误:插入字符数 m = {m}, 大于字符串长度 {len(s)-1} !\n'
              f'm 必须小于等于 {len(s)-1} (字符串长度-1!) 并且大于等于 1。')
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值