欢迎光临散文网 会员登陆 & 注册

24点算法设计 - 暴力美学

2019-03-04 22:22 作者:AICDG  | 我要投稿

最近又要到校园招聘的时间了,我也是跟风参与了笔试题的出题。出题过程中,有一道我觉得还不错的题被刷掉了觉得非常可惜,就是这道算24点的题目。既然不出了,我就拿出来分享一下,通过这道题,来帮大家热热身(虽然我觉得大家已经在狂刷各种OJ了)。

一般思路——动态规划

相信大部分人第一反应都是暴力算法,这很正常,但是无论笔试还是面试,一句暴力算法是什么问题都没解决的,怎么暴力才是关键。回答题目,这个问题如果基础知识牢固的同学自然有简单粗暴的办法,但是没有的话,你的解法肯定就是回溯法了。

简述一下24点牌回溯法的思路:

1. 先编写计算两张牌计算得到24点的函数

2. 以1中函数为基础,编写计算三张牌得到24点的函数,((1+1)+1),计算两次两张运算

3. 对4张牌进行分组,分成(3 + 1)和(2 + 2)两种情况,然后开始回溯,(((1+1)+1)+1) or ((1+1)+(1+1)),都是3次两张运算

整体上这应该是比较简单而且容易想到的思路了,也和实际玩24点牌时的思路接近。BUT,这个思路有一个巨大问题,就是代码不好写,也不太好调试。一般校招笔试一道题也就30分钟左右,计算回溯层数太多的方法在校招中其实非常吃亏。

暴力美学——穷举法

我之前提了一嘴基础知识牢固,现在就要说一下了。相信有些同学是想用穷举法的,但是想了想又算了,因为括号运算符很难表示。但如果你用后缀表达式,那括号无法表示的问题就迎刃而解了。

首先给个最暴力算法吧,加减乘除四则运算需要三个,且有可能同一个运算符需要使用三次(例如 6+6+6+6),四个数字再加3个运算符进行全排列,穷举数量为

当然这是非常复杂的情况,实际上有非常多的优化,比如:

后缀表达式的最开始两位一定都是数字,所以可能性缩减为

再比如24点可能是三连加,三连乘,但是不会出现三连减,三连除,所以可能性进一步缩减为

还有很多其他的优化,就不再列举了,不过切记一点,这是在笔试,笔试是有时间限制的,因此不要想着做太多简化而增加自己的代码量,一切以完成为最优先。

后缀表达式看似简单多了,但是对于平常代码量不太大的同学来说,还是有难度,写个后缀表达式求解就有点难度了,比如字符串parse,还有后缀表达式的计算,无论是基于栈还是基于二叉树,都是有难度的。所以,平常代码量不太大的同学,还是应该紧张起来的。

提前预祝各位参加校招的同学一切顺利。

24点算法设计 - 暴力美学的评论 (共 条)

分享到微博请遵守国家法律