运算符和操作数的排列算法

2024-03-13

我在一个面试网站上看到了这个问题—— 我们有 4 个数字,即 n1、n2、n3、n4。我们可以将它们放置在任何 顺序,我们可以在它们之间使用数学运算符 +、-、*、/ 最终结果为 24。为此编写一个算法 - 需要 4 个数字并返回 false 或 true 最终结果 24 是否可能 与任何组合。同一运算符可以多次使用。

做到这一点的方法之一是 -

  1. 排列运算符
  2. 置换操作数
  3. 将 2. 中的每个排列应用于 1. 中的每个排列。

该解决方案将是暴力解决方案,并且不是最佳解决方案。 我认为使用二叉搜索树可能有更好的解决方案。


使用 RPN(逆波兰表示法)

有关 RPN 介绍,请参见here http://en.wikipedia.org/wiki/Reverse_Polish_notation.

问题大小

我们必须构建一个包含四个数字的列表,这意味着 3 个运算符。
这些数字和运算符将被推送到堆栈或在堆栈上执行。

让我们调用执行列表 {a1 a2 a3 a4 a5 a6 a7}。

{a1 a2} 应该是数字,因为堆栈上没有一元操作。

{a7}应该是一个运算符,完成运算。

对于 {a3, a4, a5, a6},我们有多种选择,但堆栈中必须至少有两个数字才能进行操作。所以可能的组合是:(N=数字,O=运算符)

{N N O O}、{N O N O}、{O N O N}、{O N N O} 和 {N O O N}。

组合 {O O N N} 被禁止,因为第二个 O 堆栈为空。

所以我们有:

      | {N N O O} |  
      | {N O N O} |  
{N N} | {O N O N} | {O}  
      | {O N N O} |  
      | {N O O N} |  

现在我们来数一下可能的安排。当然,我们计算过多了,因为交换运算符(加号和乘号)可能会将排列树切成两半,但问题很小,不必为此烦恼。 (在序列为 {O O} 的情况下,我们也会计数过多。但我们只是继续下去..)

我们必须在 4 个数字中选择 2 个数字作为第一段,即12可能的安排。

对于中间段,剩下的两个数只能进行排列,即一个因子2

但我们还有另一个因素5用于计算中间部分的五种替代方案。

对于三个操作员,正如他们可能重复的那样,我们有一个因素4^3=64

所以问题的大小是粗体数字的乘积:12 2 5 64 = 7680。不需要优化,我们可以暴力破解。

剩下的问题是构建 7680 安排和 RPN 评估器。两项任务都相对简单。

我会发布它......它仍然是草稿,但为时已晚!明天继续!

编辑:RPN 评估器

下面是递归 RPN 求值​​器的代码。我选择用函数式语言来做(数学 http://www.wolfram.com/) 简化运算符解析

rpn[listipt_, stackipt_: {}] := 
  Module[{list=listipt,stack=stackipt}, (*recursive rpn evaluator*)

    If[list == {}, Return[stack[[1]]]];        (*end*)
    If[NumberQ[list[[1]]],                     (*if numeric*)
     Return@rpn[Rest[list], PrependTo[stack,list[[1]]]];  (*push nbr and recurse*)
    ,
     (stack[[2]]=list[[1]][stack[[2]], stack[[1]]];       (*if not, operate*)
      Return@rpn[Rest[list], Rest[stack]];);              (*and recurse*)
   ];
];

使用示例

rpn[{1, 1, 1, Plus, Plus}]
3

rpn[{2, 2, 2, Plus, Plus}]
6

rpn[{2, 3, 4, Plus, Times}]  (* (4+3)*7 *)
14

rpn[{2, 3, 4, Plus, Divide}]  (* (2+3)/4 *)
2/7  

稍后我将发布元组生成器,显示它们是 7680 以及一些关于操作可能结果的分布的有趣结果(事实上,对于 {1,2,3,4} 集,您只能得到 230不同的结果!)。

编辑:元组构造

首先我们明确构建中间部分的可能性

t1 = {{n3, n4, o1, o2}, 
      {n3, o1, n4, o2}, 
      {o1, n3, o2, n4}, 
      {o1, n3, n4, o2}, 
      {n3, o1, o2, n4}};

现在我们为 {n1,n2} 和最后一个运算符添加两个变体

t2 = Join[Map[Join[{n1, n2}, #, {o3}] &, t1], 
          Map[Join[{n2, n1}, #, {o3}] &, t1]] ( bahh ... don't mind the code*)

产生了 10 种不同的配置

现在我们必须用数字和运算符的所有可能排列来填充所有这些配置。

我们首先构造所有数字排列作为元组的分配规则

 repListNumbers = (*construct all number permutations*)
    Table[{n1 -> #[[1]], n2 -> #[[2]], n3 -> #[[3]], n4 -> #[[4]]} &[i], 
         {i, Permutations[{1, 2, 3, 4}]}];

这些小兽的形状

  {n1 -> 1, n2 -> 2, n3 -> 3, n4 -> 4}

我们可以使用它们来替换元组中的值。例如:

  {n1,n2,n3,o1,o2,n4,o3} /. {n1 -> 1, n2 -> 2, n3 -> 3, n4 -> 4}

结果是

  {1,2,3,o1,o2,4,o3}

当然,我们可以将替换规则构建为一个函数,以便能够随意更改设置的数字。 我们现在对操作员做类似的事情

repListOps =      (*Construct all possible 3 element tuples*)
  Table[{o1 -> #[[1]], o2 -> #[[2]], o3 -> #[[3]]} &[i], 
      {i, Tuples[{Plus, Times, Divide, Subtract}, 3]}];    

所以我们得到了诸如此类的集合

 {o1->Plus, o2->Plus, o3->Divide}

现在我们将元组和所有替换规则合并到一个大列表中:

t3 = Flatten[t2 /. repListNumbers /. repListOps, 2];

这导致 15360 种不同的计算。但我们知道计算结果超出了两倍,所以现在我们删除重复的元素:

t3 =Union[t3]

这给了我们预期7680元素。

仍然存在一些计数过多的情况,因为 {2,3,Times} = {3,2,Times} = 6,但这对于我们当前的目的来说是可以的。

评估结果

现在我们有了 RPN 评估器和所有这些元组,我们想知道某个最终结果是否可能。

我们只需询问该数字是否包含在结果集中:

In[252]:= MemberQ[rpn /@ t3, 24]
Out[252]= True

In[253]:= MemberQ[rpn /@ t3, 38]
Out[253]= False

事实上,结果集的界限是:

In[254]:= Max[rpn /@ t3]
Out[254]= Max[36, ComplexInfinity]

In[255]:= Min[rpn /@ t3]
Out[255]= Min[-23, ComplexInfinity]

无穷大的结果是由于我不关心被零除的事实,所以它们就在那里,就在集合内。数字区间为[-23,36]。

如果你想知道有多少个结果等于 24,只需数一下即可

      In[259]:= Length@Select[t3, rpn[#] == 24 &]
      Out[259]= 484

当然,由于“Plus”和“Times”的交换性质,其中许多排列都是微不足道的排列,但并非全部:

   {1, 2, Plus, 3, Plus, 4, Times}      -> ((1+2)+3)*4  = 24
   {2, 1, 4, 3, Times, Divide, Divide}  ->  2/(1/(4*3)) = 24

没有任何序列使用“减法”给出 24!

    In[260]:= MemberQ[Flatten@Select[t3, rpn[#] == 24 &], Subtract]
    Out[260]= False

结果 光谱样本

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运算符和操作数的排列算法 的相关文章

  • 将嵌套字典中的所有键从camelCase转换为snake_case

    我有一本类似这样的字典 firstName abc lastName xyz favoriteMovies Star Wars The lone ranger favoriteCountries country China capitalC
  • 检索受“rowspan”影响的行的列索引的最有效方法是什么?

    考虑下表 table thead tr th th th A th th B th th C th tr thead tbody tr th 1 th td Apples td td Oranges td td Pears td tr tb
  • 删除队列中的最后一个元素

    我需要删除队列的最后一个元素 我唯一可以使用的操作是 Peek 获取第一个元素而不删除它 Enqueue element 向队列末尾插入一个元素 Dequeue 删除第一个元素 IsEmpty true 或 false 队列是否为空 而且我
  • 图中的后边

    I m having a hard time understanding Tarjan s algorithm for articulation points I m currently following this tutorial he
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包
  • 在 C++ 中通过引用传递 std 算法谓词

    我正在尝试从 a 中删除元素std list并保留已删除元素的一些统计信息 为此 我使用列表中的remove if 函数 并且我有一个谓词 我想使用这个谓词来收集统计数据 这是谓词的代码 class TestPredicate privat
  • 如何为抽象工厂创建的类设置特定属性?

    是否可以让具体工厂使用抽象工厂模式为其创建具有特定类型参数的具体类 或者由各自的具体工厂创建的不同具体类是否需要具有相同的字段 例如 在下图中 您将如何使用客户端 应用程序 给出的不同参数集来实例化 WinButton 和 OSXButto
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • 7 张牌扑克手牌评估器

    有谁知道评估 7 张牌扑克牌的快速算法吗 这比简单地暴力检查 7 张牌中每 21 个 5 张牌的组合更有效 Cheers Pete 我写了一篇JavaScript 核心评估方法仅使用位操作 因此速度非常快 考虑到这一点 查看 21 种组合还
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 数学组合的完美最小哈希

    首先定义两个整数N and K where N gt K 两者都在编译时已知 例如 N 8 and K 3 接下来 定义一组整数 0 N or 1 N 如果这使答案更简单 并调用它S 例如 0 1 2 3 4 5 6 7 的子集数量S wi
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 过程式编程与 OOP 的开发成本?

    我有相当深厚的 OO 背景 OOD 和 OOP 的好处对我来说是第二天性 但最近我发现自己在一家与过程编程习惯相关的开发商店 实现语言具有一些 OOP 功能 但它们没有以最佳方式使用 更新 每个人似乎对这个话题都有自己的看法 我也是如此 但
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • 负整数的基数排序

    我正在尝试对整数 包括负整数 实现基数排序 对于非负整数 我计划为数字0 9创建一个10个队列的队列 并实现LSD算法 但我对负整数有点困惑 我现在的想法是继续为它们创建另一个包含 10 个队列的队列 并分别对它们进行排序 然后在最后 我将

随机推荐

  • composer.lock 中的 shasum 是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想升级包框架 我修改了我的composer lock 但我不明白沙苏姆 dist type zip url http www packag
  • Spring Boot Rest 中的枚举作为请求参数

    我是 Spring Boot 新手 并尝试使用 Enum 作为休息请求的参数 这是我的枚举类 public enum Month JANUARY 1 january FEBRUARY 2 february MARCH 3 march APR
  • 使用 PagedList.mvc 时如何保持/保留在同一页面上

    我正在使用 PagedList Mvc 并且添加了一种在 mvc Web 应用程序中跨各个页面进行导航的好方法 但是 当我单击 编辑 或 详细信息 选项卡并保存更改时 我会返回到第一页 我想保留在进行更改的同一页面上 这是我在控制器中的代码
  • switch 语句条件中同时具有模板和非模板转换运算符的类

    问题最初出现在这个问题 https stackoverflow com questions 25046418 internal compiler error templated conversion operator in switch e
  • 确定 Java 中 TLS 握手的 Diffie-Hellman“参数”长度

    我想与服务器建立 HTTPS 连接 如果我使用 非临时DH密钥交换 我想知道参数是什么 用于该连接 事实上 我并不关心它是否 是否短暂 我正在寻找的是建立连接然后发出警告的能力 如果连接使用 弱 DH 参数 那是我吗 可以在连接时检查吗 或
  • Caliburn Micro Xamarin 的数据绑定操作顺序

    Caliburn Micro Xamarin Android Mono Android 中数据绑定的 操作顺序 OOP 是什么 PS 解释 比较 Caliburn Micro Standard WPF Caliburn Micro Andr
  • libpng 错误:不是 PNG 文件

    我曾多次尝试将 Android Studio 构建工具升级到 1 3 1 以上 但最终总是遇到此 libpng 错误 我通过完全删除 Maven 依赖项解决了其中一个错误 因为 gradle 控制台准确地指出了问题文件所在的位置 但现在我遇
  • 无需 IDE 即可学习 C++

    我最近开始学习 C 并且对 IDE 和编译器的选择感到完全困惑 我擅长解释性语言 并且喜欢使用任何 IDE 或文本编辑器然后从命令行运行解释器的简单性 无论使用什么 IDE 一切都会按我的预期进行 因为我每次都使用相同的解释器 现在我已经开
  • 为什么比较器应该实现可序列化?

    Java 新手 在开发 Android 应用程序时学习它 我正在实现一个比较器来对文件列表和 android 文档进行排序say http developer android com reference java util Comparat
  • System.Runtime.Serialization.InvalidDataContractException:没有设置属性的方法

    正如错误所示 我的属性没有设置器 但我不需要设置器 它应该是只读的 编辑 制作设置器internal 这仍然可以在程序集中设置 但这是一个很好的技巧 当用于位于由其他人使用的程序集中的数据对象时效果很好 因为那些使用程序集将无法设置该属性
  • 如何在所选项目上启用工作流程状态“写入”?

    由于未授予工作流状态写入权限 某些项目没有写入访问权限 当我在 Access Viewer 中单击写入权限时 访问查看器通知我 由于工作流状态写入访问权限 所选用户没有访问权限 不幸的是 我无法通过安全编辑器 手动 设置它 任何人都可以阐明
  • 使用 xpath 和 telegram 即时视图提取、创建和附加

    我怎么能够create and append below a 使用上面代码中的标签XPath and 电报即时查看 https instantview telegram org docs功能 a href https expmle com
  • 如何获得 Aptana 的代码协助以与 Google Maps API v3 配合使用?

    有一个 Google 地图 API v3Visual Studio 智能感知助手 http gmapvsdoc codeplex com 这可能非常适合 Visual Studio 但 Aptana 基于 Eclipse 使用不同的 Jav
  • 发送密钥不起作用 selenium webdriver python

    我需要将文本发送到描述文本区域 有一些预定义的文本 单击后会被清除 我尝试在 sendkeys 之前使用 clear 或 click 但没有任何效果正常 它将向那里发送文本 但它仍然是灰色的 并且保存页面后出现错误 说明中没有文本 我可以使
  • 在 Java 中使用 String 和 Object 的 equals() 方法

    Object o1 new Object Object o2 new Object o1 o2 System out println o1 equals o2 它返回false 它可以返回true 如果评论被删除 为什么同样的事情不适用于S
  • 是否可以对我的 iPhone 应用程序进行逆向工程?

    我创建了一个 iPhone 应用程序 我想将编译后的 app 文件发送到我的客户端 以便他可以在他的设备上安装和测试这个 iPhone 应用程序 他是否有可能查看这个 app文件的内容 比如这个应用程序中使用的资源文件 图像 声音文件等 他
  • 在 PDF 中使用 Javascript 列出 XFA 对象的属性

    我正在尝试创建一个包含多个文本字段的 PDF 文档 这些文本字段的高度可以增长到某个最大值 由于项目的限制 我使用的是 Adob e Designer 7 它很高兴允许使用 Javascript 然而 XFA 中的对象与 HTML DOM
  • 验证不适用于 EntityManager.merge()

    我对我的实体几乎没有验证 例如 NotNull 还有一些一代人 比如 Id GeneratedValue strategy AUTO Column name ID private Long id Column GeneratedValue
  • 如何通过 CloudFront 将对象放入 S3

    我想通过 CloudFront 将图像上传到 S3 如果你看到关于CloudFront的文档 你可以发现cloud front提供了put方法来上传到cloudFront 可能会有人问我为什么使用云端上传到S3 如果你搜索一下 你就能找到解
  • 运算符和操作数的排列算法

    我在一个面试网站上看到了这个问题 我们有 4 个数字 即 n1 n2 n3 n4 我们可以将它们放置在任何 顺序 我们可以在它们之间使用数学运算符 最终结果为 24 为此编写一个算法 需要 4 个数字并返回 false 或 true 最终结