春节游戏欢乐多(春节特辑24点游戏)
春节游戏欢乐多(春节特辑24点游戏)✖️ 4 ✖️ 在 24点 游戏中,总共有 输入: [4 1 8 7] 输出: True 解释: (8-4) * (7-1) = 24 示例 2:输入: [1 2 1 2] 输出: False 注意:解析
问题
这个问题来自于 LeetCode 第 679 号问题。
你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/, ,-,(,) 的运算得到 24。
示例 1:
输入: [4 1 8 7] 输出: True 解释: (8-4) * (7-1) = 24
示例 2:
输入: [1 2 1 2] 输出: False
注意:
- 除法运算符 / 表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。
- 每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1 1 1 1] 作为输入时,表达式 -1 - 1 - 1 - 1 是不允许的。
- 你不能将数字连接在一起。例如,输入为 [1 2 1 2] 时,不能写成 12 12 。
解析
在 24点 游戏中,总共有
✖️ 4 ✖️
✖️4 ✖️
✖️ 4 = 9126 种情况,如果需要给定一列数,判断其是否可以通过以上运算满足结果为 24 的话,只需要枚举验证即可。
一般的解法就是枚举验证即可。
今天我在 LeetCode 的讨论区看到了一段让人 虎躯一震 的代码。
class Solution: def judgePoint24(self nums): bad = '对撒剘劥圞剜劏哱掶桺泛揋掵従剟剣彫寣污悫壛梄甏咍哲汭剤堧点卋嬞勆叛汬泐塵栋劚嚮咃宠吖剗楗囧力桻攋壯劯嗏桹劙剢剚焧啫栕炸栫栖嚲彳剛撑烃洿宋汷彲剙揁妷埻撧汢吩壙劇剭埼吕剝汣敯憇勇剥咎囻匓' return chr(int(''.join(map(str sorted(nums)))) 19968) not in bad
提交之后的结果是这样的。
24 点游戏提交代码
为什么可以这样?
因为在 24点 游戏中,四个数字,每个数字的取值区间为 [ 1 - 9 ], 无重复组合总数为 495 组,其中以下 92 组为无解组合:
1111 1112 1113 1114 1115 1116 1117 1119 1122 1123 1124 1125 1133 1159 1167 1177 1178 1179 1189 1199 1222 1223 1299 1355 1499 1557 1558 1577 1667 1677 1678 1777 1778 1899 1999 2222 2226 2279 2299 2334 2555 2556 2599 2677 2777 2779 2799 2999 3358 3388 3467 3488 3555 3577 4459 4466 4467 4499 4779 4999 5557 5558 5569 5579 5777 5778 5799 5899 5999 6667 6677 6678 6699 6777 6778 6779 6788 6999 7777 7778 7779 7788 7789 7799 7888 7899 7999 8888 8889 8899 8999 9999
所以只需要将这 92 种情况进行 Unicode 编码,然后对于给定输入,排序转为字符串后查询是否在这 92 种情况的编码中。