还是用的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))