1 题目描述

2 解题思路

2.1 遍历所有可能情况

我们先找出四张牌所有可能的排列组合。

然后对于每一种排列组合,我们先提出排列组合中最前面的两个数。然后对这两个数进行加\减\乘\除操作。将结果放入我们当前考虑的排列组合中。

此时排列组合中有三个元素:原来的后两个元素。和前两个元素进行数学计算后的结果。

慢的操作是对这三个数组成的序列,再求它们 的排列组合。但实际上后两个数的顺序我们是可以固定的。也就是说,如果我们接下来提取出来的两个数。有前两个数运算后的结果,那么这个结果可能在运算符的左边,也可能在运算符的右边。这两种情况我们都需要考虑

然后三个数组成的序列,经过上面一部变成了两个数。同第三步的考虑一样。两个操作数哪个在运算符的左边,哪个在右边。我们都需要进行讨论和考虑。

还有一个tips。因为这种方法我们没有排除掉除以0 的情况。为了防止除0报错,进行除法的时候,我们需要对被除数加上一个很小的数值。

class Solution:def judgePoint24(self, cards: List[int]) -> bool:ret=[]for i in cards:tmp=copy.deepcopy(cards)tmp.remove(i)for j in tmp:tmp1=copy.deepcopy(tmp)tmp1.remove(j)for k in tmp1:tmp2=copy.deepcopy(tmp1)tmp2.remove(k)l=tmp2[0]ret.append([i,j,k,l])
#四张牌所有的排列组合
'''
求排列组合的大致思想是:
我们先从四个元素组成的序列中提取一个;
然后从不含这个元素的三元素序列中提取一个;
然后是两个中选一个,最后就是另外的一个
'''def judge2(ab,cd):#print(ab,cd)return((abs(ab+cd-24)<0.001)or(abs(ab*cd-24)<0.001)or(abs(ab-cd-24)<0.001)or(abs(ab/(cd+0.0000001)-24)<0.001)or(abs(cd-ab-24)<0.001)or(abs(cd/(ab+0.0000001)-24)<0.001))
#三元序列中提取两个进行计算,得到的结果和序列中剩余的一个,这两个数能否通过某种运算达到24def judge3(ab,c,d):#print(ab,c,d)return( judge2(ab+c,d) or judge2(ab-c,d)orjudge2(ab*c,d)orjudge2(ab/(c+0.0000001),d)orjudge2(c/(ab+0.0000001),d)orjudge2(c-ab,d)orjudge2(ab,c+d)orjudge2(ab,c-d)orjudge2(ab,c*d)orjudge2(ab,c/(d+0.0000001)))
#四元序列中提取两个进行运算,得到的结果和序列中剩余的两个,这三个数能否通过什么方法使结果到24def judge4(a,b,c,d):return( judge3(a+b,c,d) or judge3(a-b,c,d)orjudge3(a*b,c,d)orjudge3(a/(b+0.0000001),c,d))
#四个数能否通过某些操作使得结果为24for i in ret:if(judge4(i[0],i[1],i[2],i[3])==True):return(True)return(False)

2.2 方法2 :递归

class Solution:def judgePoint24(self, nums: List[int]) -> bool:TARGET = 24EPSILON = 1e-6ADD, MULTIPLY, SUBTRACT, DIVIDE = 0, 1, 2, 3def solve(nums: List[float]) -> bool:if len(nums) == 1:return abs(nums[0] - TARGET) < EPSILON
#只剩下一个数了,就判断这个数和24之间的差距是否在临界差距以内
#在的话,那么说明可以通过运算得到24for i, x in enumerate(nums):for j, y in enumerate(nums):if i != j:
#从nums中找不同的两个数(区别于方法2.1的思路)newNums = list()for s, z in enumerate(nums):if s != i and s != j:newNums.append(z)
#找第三个数for k in range(4):if k < 2 and i > j:continue
'''
加和乘运算,而且第一个运算数比第二个大
这说明之前在x等于第二个运算数的时候,x+y 或者x*y已经计算过了
所以不用再次计算,直接继续循环
'''if k == ADD:newNums.append(x + y)elif k == MULTIPLY:newNums.append(x * y)elif k == SUBTRACT:newNums.append(x - y)elif k == DIVIDE:if abs(y) < EPSILON:continuenewNums.append(x / y)if solve(newNums):return True
#如果x,y运算的结果和nums中剩下的两个数组成的三个数可以算出24,那么返回TruenewNums.pop()
'''
不然的话,在三元素序列中,把当前算的这个达不到24的x,y运算结果pop出来,
然后看下一个操作符算出来的X,Y结果,和nums中剩下的两个元素组成的三元素序列满足不满足条件要求
'''return Falsereturn solve(nums)

2.3 方法3:dfs

class Solution:def judgePoint24(self, cards: List[int]) -> bool:def dfs(nums):if len(nums) == 1:return abs(nums[0] - 24) < 0.00001
#序列中只有最后一个数了,进行判断for i in range(len(nums)-1):for j in range(i+1, len(nums)):x, y = nums[i], nums[j]
#提取两个不一样的数(这里假设x在序列中的排位一定在y前面)
#所以之后考虑减法和除法的时候,需要分别考虑x和y在除/减数和被除/减数的情况rst = nums[:i] + nums[i+1:j] + nums[j+1:]
#x和y元素以外的元素拼成一个序列a = dfs(rst + [x + y])b = dfs(rst + [x - y])c = dfs(rst + [y - x])d = dfs(rst + [x * y])e = (y != 0) and dfs(rst + [x / y])f = (x != 0) and dfs(rst + [y / x])
#将x,y经过不同操作数的结果放到rst中,拼接而成的序列继续进行dfsif a or b or c or d or e or f:return Truereturn Falsereturn dfs(cards)

文巾解题 679. 24 点游戏相关推荐

  1. 文巾解题 面试题 01.04. 回文排列

    1 题目描述 2 解题思路 2.1 哈希表 创建一个哈希表,记录每个元素出现的次数.如果出现次数为奇数的元素只有一个或者没有,那么就是一个回文排列 class Solution:def canPerm ...

  2. 文巾解题 15. 三数之和

    1 题目描述 2 解题思路 2.1 使用两数之和函数 这种做法目前超时了,如果大家有想到合适的减时间/剪枝的方法,欢迎私信or评论~ 两数之和的方法见文巾解题 1. 两数之和_刘文巾的博客-CSDN博 ...

  3. 文巾解题 342. 4的幂

    1 题目描述 2 解题思路 2.1 方法1 判断log函数的结果是不是整数 class Solution:def isPowerOfFour(self, n: int) -> bool:if(n ...

  4. 文巾解题 477. 汉明距离总和

    1 题目描述 2 解题思路 2.1 暴力两两比较 两个数字之间的汉明距离可以使用 文巾解题 461. 汉明距离_刘文巾的博客-CSDN博客 中的任何一种方法,但是因为这个是两两比较,时间复杂度比较高, ...

  5. 文巾解题 1035. 不相交的线

    1 题目描述 2 解题思路 k条互不相交的直线分别连接了数组 nums1和nums2的 k 对相等的元素,而且这 k 对相等的元素在两个数组中的相对顺序是一致的,因此,这 k 对相等的元素组成的序列即 ...

  6. 679. 24 点游戏

    链接:679. 24 点游戏 题解: https://leetcode-cn.com/problems/24-game/solution/ying-gai-shi-man-hao-li-jie-de- ...

  7. ACM. HJ67 24点游戏算法 679. 24 点游戏

    HJ67 24点游戏算法 ●● 679. 24点游戏 ●●● 描述 给定一个长度为4的整数数组 cards .你有 4 张卡片,每张卡片上都包含一个范围在 [1,9] 的数字.您应该使用运算符 ['+ ...

  8. Leetcode 679. 24 点游戏 (暴力)

    题目链接:679. 24 点游戏 这个题一开始,估摸估摸着数据量,感觉应该能用暴力暴力出来,只可惜自己写的暴力有问题,自己一开始的思想是,将4个数分为两两一组组,每组做加减乘除运算-很天真对吧现在看起 ...

  9. 文巾解题 278. 第一个错误的版本

    1 题目描述 2 解题思路 二分查找见:二分查找详解_刘文巾的博客-CSDN博客 class Solution(object):def firstBadVersion(self, n):left=1r ...

最新文章

  1. url传递中文的解决方案
  2. Chmod 777到一个文件夹和所有内容[重复]
  3. maven 安装m2e 报错
  4. kie-api_7.0上的新KIE持久性API
  5. SSL/TLS捕包分析
  6. 【Kafka】kafka消费组查看lag
  7. Active Record Query Interface 数据查询接口(界面) 看到第8节。
  8. 区块链 以太坊 全局变量 状态变量 局部变量 是什么 区别
  9. XSS fuzzing 工具
  10. C语言预处理指令-单片机必备技能
  11. 2022年湖南省自考考试学前教育行政与管理练习题及答案
  12. 数据结构第一节课感受
  13. OpenCV之视频截取
  14. 如何检索或下载国内外论文、文献
  15. JVM中垃圾收集算法总结
  16. 谷歌帮——中国最牛的创业帮派
  17. UMAX系统——智能终端的领跑者
  18. 微信提醒事项功能怎么设置
  19. Android FileProvider配置和当引用包内已经含有FileProvider的多节点解决办法
  20. 《诚信》——赤兔之死

热门文章

  1. CAS SSO对手机应用支持的一种思路
  2. Visual Studio使用技巧,创建自己的代码片段
  3. Lync常识之Lync客户端有哪些
  4. oracle 查看索引类别以及查看索引字段被引用的字段方法
  5. BLE Mesh(1)—— 简述
  6. SecureCRT中Python脚本编写学习指南
  7. gb2312 requests乱码_不要相信requests返回的text
  8. vue重启node_【ts】vue-typescript-admin类型any仍然报错
  9. 测试晶面间距软件_超逼真动图解析常用15大分析测试仪器,必收藏!SEM, 红外,紫外,核磁,质谱,TEM,ICP等...
  10. mysql当前时间加一天_MySQL 的加锁处理,你都了解的一清二楚了吗?