小浩算法|一文让你学会如何用代码判断"24"点
“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"点的更多相关文章
- 一文带你学会java的jvm精华知识点
前言 本文分为20多个问题,通过问题的方式,来逐渐理解jvm,由浅及深.希望帮助到大家. 1. Java类实例化时,JVM执行顺序? 正确的顺序如下: 1父类静态代码块 2父类静态变量 3子类静态代码 ...
- 三文搞懂学会Docker容器技术(中)
接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...
- 三文搞懂学会Docker容器技术(下)
接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...
- P2699 【数学1】小浩的幂次运算
原题链接 https://www.luogu.org/problemnew/show/P2699 P2699 [数学1]小浩的幂次运算 首先第一眼看这个题就知道要暴力枚举w^i 看是否在区间[l,r] ...
- <<一种基于δ函数的图象边缘检测算法>>一文算法的实现。
原始论文下载: 一种基于δ函数的图象边缘检测算法. 这篇论文读起来感觉不像现在的很多论文,废话一大堆,而是直入主题,反倒使人觉得文章的前后跳跃有点大,不过算法的原理已经讲的清晰了. 一.原理 ...
- 小程序和ThinkPHP5结合实现登录状态(含代码)
本篇文章给大家带来的内容是关于小程序和ThinkPHP5结合实现登录状态(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 微信小程序中,一般会涉及三种登录方式: 1. 使用微 ...
- FP-growth算法高效发现频繁项集(Python代码)
FP-growth算法高效发现频繁项集(Python代码) http://blog.csdn.net/leo_xu06/article/details/51332428
- Word文档中的语法高亮显示代码
有时候我们程序员也需要在word文档里面显示代码,但是直接复制过去 不好看,格式也不太对,这里给大家分享一个Word文档中的语法高亮显示代码的方法 http://www.planetb.ca/synt ...
- 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版)
TableGo v6.0.0 版震撼发布,此次版本更新如下: 1.UI界面大改版,组件大调整,提升界面功能的可扩展性. 2.新增BeautyEye主题,界面更加清新美观,也可以通过配置切换到原生Jav ...
随机推荐
- options请求(复杂请求)
1.请求发送: HEAD. GET. POST2.请求头信息: Accept Accept-Language Content-Language Last-Event-ID ...
- Exception in thread "main" java.lang.AbstractMethodError: org.springframework.boot.context.config.ConfigFileApplicationListener.supportsSourceType(Ljava/lang/Class;)Z
依赖冲突,查看pom.xml文件 查看parent项目的依赖版本为 <parent> <groupId>org.springframework.boot</groupId ...
- Dappy如何防止DNS黑客入侵
作者:Raphaël 译者注:Dappy是RChain生态中的DNS[域名系统(服务)协议].Dappy基于RChain的技术架构保障了域名系统的安全性. Dappy是一个用于文件和Web应用程序的去 ...
- 超越队西柚考勤系统--Beta冲刺2
超越队西柚考勤系统- -beta冲刺2 格式描述 这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业链接 团队名称 超越队(西柚考勤系统) 这个作业的目标 对alpha版本的程序进行改进,代码核 ...
- 异想家Ubuntu安装的软件
[替换国内源] https://developer.aliyun.com/mirror/ubuntu 我提供一个下载,方便第一次安装懒得敲命令: https://jfz.me/16.04/source ...
- Java之函数式接口@FunctionalInterface详解(附源码)
Java之函数式接口@FunctionalInterface详解 函数式接口的定义 在java8中,满足下面任意一个条件的接口都是函数式接口: 1.被@FunctionalInterface注释的接口 ...
- apache和nginx那点事儿--阻塞和异步
先明白的事儿:当一个程序在执行的时候,一般会创建一个进程,也可以有多个进程.一个进程至少会创建一个线程,多个线程共享一个程序进程的内存.程序的运行最终是靠线程来完成操作的.线程的数量跟CPU核数有关, ...
- Git基础常用功能
一.安装 具体查看 安装Git 二.使用 基础知识 工作区(Workspace):就是你在电脑里能看到的项目目录. 暂存区(Index / Stage):临时存放更改的地方,使用命令"git ...
- springIOC源码接口分析(八):AutowireCapableBeanFactory
参考博文: https://blog.csdn.net/f641385712/article/details/88651128 一 接口规范 从宏观上看,AutowireCapableBeanFact ...
- K8s下部署Istio
一.环境准备 1.1环境信息 主机名 IP地址 用途 zhengzw-k8s-master 10.10.100.7 K8s Master zhengzw-k8s-node-1 10.10.100.15 ...