“24点”是一种数学游戏,正如象棋、围棋一样是一种人们喜闻乐见的娱乐活动。它始于何年何月已无从考究,但它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受。今天就为大家分享一道关于“24点”的算法题目。

话不多说,直接看题。

题目:你有 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 。

题目分析

拿到题目,第一反应就可以想到暴力求解。如果我们要判断给出的4张牌是否可以通过组合得到24,那我们只需找出所有的可组合的方式进行遍历。

4个数字,3个操作符,外加括号,基本目测就能想到组合数不会大到超出边界。所以,我们只要把他们统统列出来,不就可以进行求解了吗?说干就干!

我们首先定义个方法,用来判断两个数的的所有操作符组合是否可以得到24。

func judgePoint24_2(a, b float64) bool {
return a+b == || a*b == || a-b == || b-a == || a/b == || b/a ==
}

但是这个方法写的正确吗?其实不对!因为在计算机中,实数在计算和存储过程中会有一些微小的误差,对于一些与零作比较的语句来说,有时会因误差而导致原本是等于零但结果却小于或大于零之类的情况发生,所以常用一个很小的数 1e-6 代替 0,进行判读!

(1e-6:表示1乘以10的负6次方。Math.abs(x)<1e-6 其实相当于x==0。1e-6(也就是0.000001)叫做epslon,用来抵消浮点运算中因为误差造成的相等无法判断的情况。这个知识点需要掌握!)

举个例子:

func main() {
var a float64
var b float64
b = 2.0
//math.Sqrt:开平方根
c := math.Sqrt()
a = b - c*c
fmt.Println(a == ) //false
fmt.Println(a < 1e- && a > -(1e-)) //true
}

这里直接用 a==0 就会得到false,但是通过 a < 1e-6 && a > -(1e-6) 却可以进行准确的判断。

所以我们将上面的方法改写:

//go语言
//judgePoint24_2:判断两个数的所有操作符组合是否可以得到24
func judgePoint24_2(a, b float64) bool {
return (a+b < +1e- && a+b > -1e-) ||
(a*b < +1e- && a*b > -1e-) ||
(a-b < +1e- && a-b > -1e-) ||
(b-a < +1e- && b-a > -1e-) ||
(a/b < +1e- && a/b > -1e-) ||
(b/a < +1e- && b/a > -1e-)
}

完善了通过两个数来判断是否可以得到24的方法,现在我们加一个判断三个数是否可以得到24的方法。

//硬核代码,不服来辩!
func judgePoint24_3(a, b, c float64) bool {
return judgePoint24_2(a+b, c) ||
judgePoint24_2(a-b, c) ||
judgePoint24_2(a*b, c) ||
judgePoint24_2(a/b, c) ||
judgePoint24_2(b-a, c) ||
judgePoint24_2(b/a, c) || judgePoint24_2(a+c, b) ||
judgePoint24_2(a-c, b) ||
judgePoint24_2(a*c, b) ||
judgePoint24_2(a/c, b) ||
judgePoint24_2(c-a, b) ||
judgePoint24_2(c/a, b) || judgePoint24_2(c+b, a) ||
judgePoint24_2(c-b, a) ||
judgePoint24_2(c*b, a) ||
judgePoint24_2(c/b, a) ||
judgePoint24_2(b-c, a) ||
judgePoint24_2(b/c, a)
}

好了。三个数的也出来了,我们再加一个判断4个数为24点的方法:(排列组合,我想大家都会....)

前方高能!!!

前方高能!!!

前方高能!!!

//硬核代码,不服来辩!
func judgePoint24(nums []int) bool {
return judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) || judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) || judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) || judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) || judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) || judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[]))
}

Go语言示例

搞定收工,我们整合全部代码如下:

//硬核编程...
func judgePoint24(nums []int) bool {
return judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) || judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) || judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) || judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) || judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) || judgePoint24_3(float64(nums[])+float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])*float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])-float64(nums[]), float64(nums[]), float64(nums[])) ||
judgePoint24_3(float64(nums[])/float64(nums[]), float64(nums[]), float64(nums[]))
} func judgePoint24_3(a, b, c float64) bool {
return judgePoint24_2(a+b, c) ||
judgePoint24_2(a-b, c) ||
judgePoint24_2(a*b, c) ||
judgePoint24_2(a/b, c) ||
judgePoint24_2(b-a, c) ||
judgePoint24_2(b/a, c) || judgePoint24_2(a+c, b) ||
judgePoint24_2(a-c, b) ||
judgePoint24_2(a*c, b) ||
judgePoint24_2(a/c, b) ||
judgePoint24_2(c-a, b) ||
judgePoint24_2(c/a, b) || judgePoint24_2(c+b, a) ||
judgePoint24_2(c-b, a) ||
judgePoint24_2(c*b, a) ||
judgePoint24_2(c/b, a) ||
judgePoint24_2(b-c, a) ||
judgePoint24_2(b/c, a)
} func judgePoint24_2(a, b float64) bool {
return (a+b < +1e- && a+b > -1e-) ||
(a*b < +1e- && a*b > -1e-) ||
(a-b < +1e- && a-b > -1e-) ||
(b-a < +1e- && b-a > -1e-) ||
(a/b < +1e- && a/b > -1e-) ||
(b/a < +1e- && b/a > -1e-)
}

由于代码过于硬核,

我们直接击败100%的对手:

(没想到吧!代码还可以这么写~)

本期的题目应该都能看懂吗?

大家还有其他的方法来得到答案吗?

评论区留下你的想法吧!

来源:宜信技术学院

小浩:宜信科技中心攻城狮一枚,热爱算法,热爱学习,不拘泥于枯燥编程代码,更喜欢用轻松方式把问题简单阐述,希望喜欢的小伙伴可以多多关注!

原文首发于:「小浩算法」

小浩算法|一文让你学会如何用代码判断"24"点的更多相关文章

  1. 一文带你学会java的jvm精华知识点

    前言 本文分为20多个问题,通过问题的方式,来逐渐理解jvm,由浅及深.希望帮助到大家. 1. Java类实例化时,JVM执行顺序? 正确的顺序如下: 1父类静态代码块 2父类静态变量 3子类静态代码 ...

  2. 三文搞懂学会Docker容器技术(中)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...

  3. 三文搞懂学会Docker容器技术(下)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...

  4. P2699 【数学1】小浩的幂次运算

    原题链接 https://www.luogu.org/problemnew/show/P2699 P2699 [数学1]小浩的幂次运算 首先第一眼看这个题就知道要暴力枚举w^i 看是否在区间[l,r] ...

  5. <<一种基于δ函数的图象边缘检测算法>>一文算法的实现。

    原始论文下载: 一种基于δ函数的图象边缘检测算法. 这篇论文读起来感觉不像现在的很多论文,废话一大堆,而是直入主题,反倒使人觉得文章的前后跳跃有点大,不过算法的原理已经讲的清晰了.     一.原理 ...

  6. 小程序和ThinkPHP5结合实现登录状态(含代码)

    本篇文章给大家带来的内容是关于小程序和ThinkPHP5结合实现登录状态(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 微信小程序中,一般会涉及三种登录方式: 1. 使用微 ...

  7. FP-growth算法高效发现频繁项集(Python代码)

    FP-growth算法高效发现频繁项集(Python代码) http://blog.csdn.net/leo_xu06/article/details/51332428

  8. Word文档中的语法高亮显示代码

    有时候我们程序员也需要在word文档里面显示代码,但是直接复制过去 不好看,格式也不太对,这里给大家分享一个Word文档中的语法高亮显示代码的方法 http://www.planetb.ca/synt ...

  9. 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版)

    TableGo v6.0.0 版震撼发布,此次版本更新如下: 1.UI界面大改版,组件大调整,提升界面功能的可扩展性. 2.新增BeautyEye主题,界面更加清新美观,也可以通过配置切换到原生Jav ...

随机推荐

  1. 测试工具Fiddler(一)—— 基础知识

    Fiddler基础知识 一.Fiddler是什么? Fiddler是一个http协议调试代理工具,它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据.设置断点. ...

  2. C++数值计算

    1.序 (1)程序设计分两种: 1.结构化设计(面向过程)——分解算法为模块,将算法的步骤分解为模块. 2.面向对象程序设计——主要是“类”与“对象”. (2)进制的转换 1.二进制转十进制 整数部分 ...

  3. WebGL简易教程(十五):加载gltf模型

    目录 1. 概述 2. 实例 2.1. 数据 2.2. 程序 2.2.1. 文件读取 2.2.2. glTF格式解析 2.2.3. 初始化顶点缓冲区 2.2.4. 其他 3. 结果 4. 参考 5. ...

  4. 【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中

    最近有一个将 mysql 数据导入到 MongoDB 中的需求,打算使用 Kettle 工具实现.本文章记录了数据导入从0到1的过程,最终实现了每秒钟快速导入约 1200 条数据.一起来看吧~ 一.K ...

  5. java中常用的锁机制

    基础知识 基础知识之一:锁的类型 锁就那么几个,只是根据特性,分为不同的类型 锁的概念 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限 ...

  6. react元素获取e时,点击target为空的现象

    今天呢,学习react过程中,我要获取一个元素的e, checkAll=(e)=>{ console.log(e) console.log(e.target) } render() { retu ...

  7. 每天敲一点code

    下面这段代码摘自 <C#并发编程经典实例> 并行LINQ static IEnumerable<int> MultiplyBy2(IEnumerable<int> ...

  8. 一文带你了解 HTTP 黑科技

    这是 HTTP 系列的第三篇文章,此篇文章为 HTTP 的进阶文章. 在前面两篇文章中我们讲述了 HTTP 的入门,HTTP 所有常用标头的概述,这篇文章我们来聊一下 HTTP 的一些 黑科技. HT ...

  9. mysql+jpa简单实现步骤

    首先,我们用的开发工具是IDEA,数据库是mysql,以下是步骤: 1.我们需要在pom.xml加入mysql和jpa的依赖 <!-- 依赖的数据库,使用jpa --> <depen ...

  10. 《 Java 编程思想》CH03 操作符

    < Java 编程思想>CH03 操作符 在最底层,Java中的数据是通过操作符来操作的. 操作符 +,-,*,*,=与其他语言类似 几乎所有的操作符只能操作"基本类似" ...