24点游戏

描述: 你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。

分析: 题目意思就是求24点,但是直接说很抽象,这里举[4, 1, 8, 7]这个例子。那就往两个数之间填运算符,假如填充的是4-1+87这样一个式子,显然87是先计算的。如果题目没有给我们括号,那么无论我们按什么顺序填符号都是8*7先算。现在给了我们括号也就是说如果我们取4,1两个数出来,可以加上括号(4-1)先运算。就是这个括号给我们递归创造了条件。

所以,我们就可以使用递归枚举的思路。
1、每次枚举出来两个数,然后进行运算变成一个数,返回给数组。(减治法思想,所以相当每次使用一个数组存储,然后作为递归函数的参数)
2、截止条件为最终的数组长度为1。
ex:因为该题除法运算为实数除法。所以使用double带小数计算,然后对结果进行判断。

递归树如下所示: (不是完整的递归树)


由于[4,1,8,7]计算出24点的情况是(8-4)*(7-1)=24。所以取数时无所谓顺序。(这与B站一道面试题不同,是按顺序填充运算符)

 // isValid标识剪枝的dfspublic boolean helper1(double[] arr) {if (arr.length == 1) {return Math.abs(arr[0] - 24) < 1e-6;}// 枚举两个数for (int i = 0; i < arr.length; i++) {for (int j = i + 1; j < arr.length; j++) {int idx = 0;double next[] = new double[arr.length - 1];// 先创建arr.length-1的next,尾部去填充新数for (int k = 0; k < arr.length; k++) {if (k != i && k != j) {next[idx++] = arr[k];}}// 四则运算boolean isValid = false;int ed = next.length - 1;for (double num : caculate(arr[i], arr[j])) {next[ed] = num;isValid = isValid || helper1(next);}if (isValid) {return true;}}}return false;}//java中int/0是infinity,所以可以不用讨论除数为零的情况。public double[] caculate(double x, double y) {return new double[] { x + y, x * y, x - y, y - x, x / y, y / x };}public boolean judgePoint24(int[] nums) {if (nums == null || nums.length == 0) {return false;}double[] arr = new double[] { nums[0], nums[1], nums[2], nums[3] };return helper1(arr);}

补充:B站笔试中有一道笔试题:也是给你+,-,x,/,(,)求24点。当时看到有人,是按顺序做也全部ac了。所以推测应该是按顺序填运算符的。

代码如下:

// 按顺序填运算符private static boolean f = false;public static void dfs(int[] nums, int idx, int sum) {if (idx == nums.length || f) {if (sum == 24) {f = true;}return;}dfs(nums, idx + 1, sum + nums[idx]);dfs(nums, idx + 1, sum - nums[idx]);dfs(nums, idx + 1, sum * nums[idx]);if (nums[idx] != 0) {dfs(nums, idx + 1, sum / nums[idx]);}}public static void main(String[] args) {double x = 5;double y = 0;System.out.println(x / y);int[] nums = { 2, 4, 3, 1 };dfs(nums, 0, 0);System.out.println(f);//true}

力扣679.24点游戏相关推荐

  1. 力扣—679—24点游戏

    题目描述 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: (8-4) ...

  2. 679. 24 点游戏

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

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

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

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

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

  5. LeetCode 679. 24 点游戏(回溯)

    文章目录 1. 题目 2. 解题 1. 题目 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输 ...

  6. [力扣题解] 174. 地下城游戏 DP

    一.题目详情 原题链接:174. 地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿 ...

  7. 文巾解题 679. 24 点游戏

    1 题目描述 2 解题思路 2.1 遍历所有可能情况 我们先找出四张牌所有可能的排列组合. 然后对于每一种排列组合,我们先提出排列组合中最前面的两个数.然后对这两个数进行加\减\乘\除操作.将结果放入 ...

  8. 力扣题:生命游戏解题(未考虑内存消耗)

    题目: 根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞 ...

  9. 2022.1.28 力扣-每日一题-游戏中弱角色的数量

    题目描述: 你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 和 防御 .给你一个二维整数数组 properties ,其中 properties[i] = [attacki, defense ...

最新文章

  1. 统计计量 | 实证研究中常犯的18个统计学错误, 避坑防雷指南!
  2. ActiveX(二)
  3. 数据包格式_理解MQTT协议数据包结构
  4. WayOs路由器WAN口帐号保存工具,可直接发送至邮箱,及保存接口VLAN号
  5. 远程办公从学习开始,潜伏在家,技术如何逆袭?
  6. 恭喜!已获8个院士的他,又新当选德国院士!
  7. APK反编译之APKTOOL的使用
  8. 优必选能开放软硬件源代码吗_四个项目供父母教孩子如何使用开放式硬件和电子产品...
  9. java pdf在线阅读插件_JAVA实现在线查看PDF和office文档
  10. Windows Shell 编程学习总结
  11. vscode配置Git管理工具GitLens
  12. 闭环控制 matlab仿真,反馈闭环控制系统Simulink仿真(带电流补偿的电压内环,直流调速)...
  13. 10个技巧,帮你改进UI设计
  14. php 图片外链限制,如何解决新浪微博图床限制图片外链的问题 | 骤雨打新荷
  15. 病毒性感冒和细菌性感冒怎样区分
  16. 软件开发中常见名词解释
  17. 义乌集训Day 6 T2
  18. php爬虫邮箱邮件,简单网络爬虫实现爬取网页邮箱
  19. OpenSea合约深度解析——atomicMatch_ 篇
  20. MOSFET开通特性(1)——输入特性

热门文章

  1. 1×pbs缓冲液配方_【应用】蒸渗仪与氧化还原电位的测量1
  2. mysql 从库开启复制慢日志_Mysql数据库优化之开启慢查询日志
  3. Hello World!!!
  4. mysql 8.0.11安装教程
  5. MySQL增删改查基础知识
  6. bzoj 4393 Usaco Fruit Feast
  7. 修改linux服务器时间
  8. CSS背景颜色渐变处理
  9. java sftp 密钥_通过密钥 SFTP (二):启用没有 Shell 访问权限的 SFTP 账户
  10. MySQL深度剖析之SQL语句更新流程(2021)