程序员的算法趣题(python解法)-01:数列的四则运算

写在前面

在跨年活动中很荣幸获得力扣送的2020年度实体勋章和《程序员的算法趣题》实体书。
在这里插入图片描述

最近正好过年期间有时间阅读此书,但由于书中所用解题语言大多为ruby和javascript,故决定在本专栏挑选其中一些经典的题目用python代码来完成。
原书电子版可在https://leetcode-cn.com/leetbook/detail/interesting-algorithm-puzzles-for-programmers/上查看。

问题

在这里插入图片描述

解题思路

求解空间是1000-9999,也就是所有的四位正整数,在这四个数字中最多可以插入三个运算符,若插入运算符后的运算结果满足题目要求,则求得答案。
由于题目没有明确说明例如‘06’这种带前缀零的数字是否合法,这里默认’06‘就代表数字6(即可带前缀零)。
在编写代码时难点在于根据插入运算符后的字符串求得运算结果,在下面的代码中用cal()函数实现。(原书中是用js自带的eval函数进行检验,但用python中的eval实际运行时遇到被除数为‘0’或遇到‘06’这种数字时会报错,所以下面的代码中用的是自己写的cal函数)

代码

def cal(t):
    t+='+'
    num=0
    op='+'
    stack=[]
    for i in t:
        if i.isdigit():
            num=num*10+int(i)
        else:
            if op=='+':
                stack.append(num)
            elif op=='-':
                stack.append(-num)
            elif op=='*':
                stack.append(stack.pop()*num)
            elif op == '/':
                #被除数不能等于零
                if num==0:
                    return
                stack.append(stack.pop()/num)
            op=i
            num=0
    return sum(stack)

res=set()
ops=['+','-','*','/','']
for i in range(1000,10000):
    s=str(i)
    for op1 in ops:
        for op2 in ops:
            for op3 in ops:
                t=s[0]+op1+s[1]+op2+s[2]+op3+s[3]
                #len(t)>4因为题目要求至少插入1个运算符
                if len(t)>4 and cal(t)==int(s[::-1]):
                    res.add(i)
                    print(t+'='+s)
print(res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值