题解 | #24点运算#

24点运算

https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d?tpId=37&tqId=21312&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D2%26tpId%3D37%26type%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

import sys
import itertools
#from numpy import product



s = input().split()


def compute24(s):

    #包含大小王的情况,不处理,直接输出ERROR
    if "joker" in s:
        print("ERROR")
        return

    elif "JOKER" in s:
        print("ERROR")
        return

    #替换J QKA中的值


    for i in range(len(s)):
        if s[i]=="J":
            s[i]=11

        elif s[i]=="Q":
            s[i]=12

        elif s[i]=="K":
            s[i]=13


        elif s[i]=="A":
            s[i]=1

    operations=["+","-","*","/"]
    operate_number=list(map(lambda x:int(x),s))


    #利用笛卡尔积生成操作种类
    L1=[ i for i in itertools.product(operations,repeat=3)]
    

    #利用Proxxx生成操作数的全排列

    L2=[i for i in itertools.permutations(operate_number,4)]

    L2=list(set(L2))

    #将操作数和操作符拼接,中间需要用括号保证先计算前俩位,然后用结果与第三位计算,最后和第四位计算
	#即((A operate B)operate c) operate D,所以我先添加了2个括号,然后在第二个操作数和第三个操作数后添加了一个括号各,
  
    j=0
    L4=[]
	#遍历操作数
    for x in L2:
	  #遍历操作符号
        for y in L1:
            j=0
            L3=[]
            L3.append("((")
            for i in range(len(x)):
                L3.append(x[i])
				#当添加第二或者第三个操作数的时候添加完记得加括号
                if i==1 or i==2:
                    L3.append(")")
				#j<2说名添加完了操作符号,只需要再添加一个操作数就可以退出for循环本次的,
                if j <=2:
                    L3.append(y[j])
                    j+=1
            L4.append(L3)
    


    MathRepresenttions=[]

    i=0
    for i in L4:
        i=list(map(lambda x: str(x),i))
        expression = "".join(i)
        MathRepresenttions.append(expression)
    x=0

    L5=[]
    for x in MathRepresenttions:
        result =eval(x)
        if result==24:
            L5.append(x)

        
        
    #将之前替换的替换回来输出
    if len(L5)==0:
        print("NONE")
    else:
        for i in L5:
            L6=[]

            if "13" in i:
                i=i.replace("13","K")
            if "12" in i:
                i=i.replace("12","Q")
            if "11" in i:
                i=i.replace("11","J")
            if  "1" in i:
                i=i.replace("1","A")
          #去掉括号,输出的时候不用括号,从左到右计算
            for j in i:
                if j =="(" or j==")":
                    pass
                else:
                    L6.append(j)
            print("".join(L6))
            return





compute24(s)

全部评论

相关推荐

11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
伟大的烤冷面被普调:暨大✌🏻就是强
点赞 评论 收藏
分享
勤奋努力的椰子这就开摆:美团骑手在美团工作没毛病
投递美团等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务