热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

给定一个数组,用(+,,*,/)计算出结果为N的表达式

2019独角兽企业重金招聘Python工程师标准我得解法只是简单的暴力求解,尝试每一种可能性,把符合条件的结果找出来。应该是有更加高效的算法&#x

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

我得解法只是简单的暴力求解,尝试每一种可能性,把符合条件的结果找出来。应该是有更加高效的算法,至少可以用到剪枝;仅仅是暴力求解,似乎没有拿来做得理由,主要是为了用scala尝试functional的解法,通过构建基础的组件(函数),将它们组合,最后得到结果;

完整的代码如下:

object App extends App {abstract trait Op {def value: Intdef expression: Stringdef isValid: Boolean}object Op {def list(x: Op, y: Op) &#61; List(Add(x, y), Sub(x, y), Mul(x, y), Div(x, y))}case class Add(left: Op, right: Op) extends Op {override def value: Int &#61; left.value &#43; right.valueoverride def expression: String &#61; "(" &#43; left.expression &#43; " &#43; " &#43; right.expression &#43; ")"override def isValid: Boolean &#61; left.value <&#61; right.value}case class Sub(left: Op, right: Op) extends Op {override def value: Int &#61; left.value - right.valueoverride def expression: String &#61; "(" &#43; left.expression &#43; " - " &#43; right.expression &#43; ")"override def isValid: Boolean &#61; left.value > right.value}case class Mul(left: Op, right: Op) extends Op {override def value: Int &#61; left.value * right.valueoverride def expression: String &#61; left.expression &#43; " * " &#43; right.expressionoverride def isValid: Boolean &#61; left.value <&#61; right.value && left.value !&#61; 1 && right.value !&#61; 1}case class Div(left: Op, right: Op) extends Op {override def value: Int &#61; left.value / right.valueoverride def expression: String &#61; left.expression &#43; " / " &#43; right.expressionoverride def isValid: Boolean &#61; right.value !&#61; 0 && left.value % right.value &#61;&#61; 0 && right.value !&#61; 1}case class Val(override val value: Int) extends Op {override def expression: String &#61; s"$value"override def isValid: Boolean &#61; true}def splitArray(array: List[Int]): List[(List[Int], List[Int])] &#61;array match {case Nil &#61;> throw new RuntimeException("no empty array allowed here.")case x :: y :: Nil &#61;> List((List(x), List(y)))case h :: tail &#61;>(List(h), tail) :: (for {(x, y) <- splitArray(tail)} yield (h :: x, y))}def express(nums: List[Int]): List[Op] &#61;nums match {case Nil &#61;> throw new RuntimeException("empty list")case x :: Nil &#61;> List(Val(x))case _ &#61;>for {(left, right) <- splitArray(nums)x <- express(left)y <- express(right)op <- Op.list(x, y)if op.isValid} yield op}def choices(nums: List[Int]): List[List[Int]] &#61; {def go(lists: List[List[Int]], i: Int, used: Set[Int]): List[List[Int]] &#61;if (i &#61;&#61; nums.length) listselse {for {x <- numsif (!used(x))subChoice <- go(lists &#43;&#43; lists.map(x :: _), i &#43; 1, used &#43; x)} yield {subChoice}}go(List(Nil), 0, Set.empty).toSet.toList}def countDown(nums: Array[Int], res: Int): List[Op] &#61; {for {list <- choices(nums.toList)if (!list.isEmpty)op <- express(list)if (op.value &#61;&#61; res)} yield op}choices(Array(1, 3, 10).toList).foreach(println)//  splitArray(Array(1, 3, 7, 10, 25, 50).toList).foreach(println)val opList &#61; countDown(Array(1, 3, 7, 10, 25, 50), 765)opList.foreach(op &#61;> println(op.expression))
}

1. 之所以使用Op trait&#xff0c;主要有两个作用&#xff0c;a. 我们不仅仅是关心最后的值&#xff0c;是否等于765&#xff0c;也关心这个表达式本身&#xff1b;2. 判断这个表达式是否有效&#xff0c;计算出的结果是否是整数&#xff1b;

2. choices(list), 返回用list元素的所有可能的组合&#xff0c;比如choicee(list(1, 2)) &#61;> [], [1], [2], [1, 2], [2, 1]&#xff1b;接下来可以用每个组合去求出Op。 这个方法的时间复杂度即为n!, 所以可以看出这个算法只能是玩玩而已&#xff1b;

3. 然后用上面求出的组合&#xff0c;去计算表达式&#xff0c;a. 要过滤掉过的集合&#xff0c;因为我们没有用来表示空的Op&#xff0c;b. 对于只有一个元素的集合&#xff0c;只有一种可能性&#xff0c;就是该元素本身&#xff0c; Val(x); c. 当有多个元素的时候&#xff0c;需要把该集合切分成两边&#xff0c;递归计算Op&#xff0c;然后把Op合并&#xff1b;


Just For Fun.




转:https://my.oschina.net/u/922297/blog/419730



推荐阅读
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 本文介绍了一种求解最小权匹配问题的方法,使用了拆点和KM算法。通过将机器拆成多个点,表示加工的顺序,然后使用KM算法求解最小权匹配,得到最优解。文章给出了具体的代码实现,并提供了一篇题解作为参考。 ... [详细]
  • 《树莓派开发实战(第2版)》——2.2 创建模型和运行推理:重回Hello World
    本节书摘来异步社区《概率编程实战》一书中的第2章,第2.2节,作者:【美】AviPfeffer(艾维费弗)&# ... [详细]
  • 巧用arguments在Javascript的函数中有个名为arguments的类数组对象。它看起来是那么的诡异而且名不经传,但众多的Javascript库都使用着它强大的功能。所 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了PHP常量的定义和使用方法,包括常量的命名规则、大小写敏感性、全局范围和标量数据的限制。同时还提到了应尽量避免定义resource常量,并给出了使用define()函数定义常量的示例。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 本文介绍了在Java中检查字符串是否仅包含数字的方法,包括使用正则表达式的示例代码,并提供了测试案例进行验证。同时还解释了Java中的字符转义序列的使用。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
纪志鹏大利集客_776
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有