HJ89 题解 | #24点运算#

24点运算

https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d

还是用的67题的暴力组合的方法,看到有题解用的递归函数来计算多次运算,这个思路也很好,可以计算更多张牌的组合,如果用for循环就落入俗套了。

有几个细节需要注意:

1、如果需要使用一个列表的数据,并且要修改数据,而且又不影响源数据,这就需要切片,而不能直接使用赋值,因为赋值只是创建一个新的引用,二者是共用内存地址的,这样会改此动彼。

2、remove()方法只会移除遇到的第一个元素

3、需要强制从左到右计算,可以用eval和小括号组合实现

#这道题才能算得上【较难】,是67和88题的组合题目
#Tips:
#remove函数只会移除一个列表元素
#对于需要改动列表但是又不想影响原来的列表的情况,需要用切片

#思路:
#先按照权值转换为数字,再计算4个数字是否能产生24点
#这道题的限制条件也很多,对做题人来说很有利


a=input().split()
std1="3 4 5 6 7 8 9 10 J Q K A 2".split()
std2="3 4 5 6 7 8 9 10 11 12 13 1 2".split()

def check(a):
    #特判大小王
    if "joker" in a or "JOKER" in a:
        return "ERROR"

    for i in range(len(a)):#转为数字
        a[i]=std2[std1.index(a[i])]
    # print(a)

    #开始计算24点
    for i in a:#挑选第一个数字
        temp=a[:]
        temp.remove(i)
        b=temp#得到挑选之后剩下的列表
        for j in b:
            temp=b[:]
            temp.remove(j)
            c=temp
            for k in c:
                temp=c[:]
                temp.remove(k)
                d=temp[0]#最后一个数字

                #遍历操作符
                for l in ["+","-","*","//"]:
                    for m in ["+","-","*","//"]:
                        for n in ["+","-","*","//"]:
                            # print(i+l+j+m+k+n+d.replace("//","/"))
                            if eval("(("+i+l+j+")"+m+k+")"+n+d)==24:
                                #从数字换回牌
                                i=std1[std2.index(i)]
                                j=std1[std2.index(j)]
                                k=std1[std2.index(k)]
                                d=std1[std2.index(d)]
                                a=i+l+j+m+k+n+d
                                ans=a.replace("//","/")
                                return ans
    return "NONE"
print(check(a))

#华为##华为od##华为机试##华为od机试#
华为HJ103所有解法 文章被收录于专栏

这是我准备华为od面试的专属专栏,我会把自己的解法更新在里面,我会尽量写清楚自己的思路以及多写关键注释,希望对阅读的人有帮助~~~

全部评论

相关推荐

炫哥_:为什么都读硕士了?项目还是网上的项目(真心发问)
最后再改一次简历
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务