生成数字数组中有效的数字组合

2024-04-09

我正在尝试从数字数组中生成所有有效的数字组合。假设我们有以下内容:

let arr = [1, 2, 9, 4, 7];

我们需要输出这样的内容:

1 2 9 4 7
1 2 9 47
1 2 94 7
1 2 947
1 29 4 7
1 29 47
1 294 7
1 2947
12 9 4 7
12 9 47
12 94 7
12 947
129 4 7
129 47
1294 7
12947

无效号码为 91、497、72 等。

我尝试了这个,但我对结果不满意:

const combination = (arr) => {

  let i, j, temp;
  let result = [];
  let arrLen = arr.length;
  let power = Math.pow;
  let combinations = power(2, arrLen);

  for (i = 0; i < combinations; i += 1) {
    temp = '';

    for (j = 0; j < arrLen; j++) {
      if ((i & power(2, j))) {
        temp += arr[j];
      }
    }
    result.push(temp);
  }
  return result;
}

const result = combination([1, 2, 9, 4, 7]);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

有任何想法吗?


这段代码可以实现你想要的功能:

const arr = [1, 2, 9, 4, 7],
  result = Array.from({length: 2 ** (arr.length - 1)}, (_, index) => index.toString(2).padStart(arr.length - 1, "0"))
    .map((binary) => JSON.parse("[" + arr.map((num, position) => num + (Number(binary[position]) ? "," : "")).join("") + "]"));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

其结果是:

[
  [12947],
  [1294, 7],
  [129, 47],
  [129, 4, 7],
  [12, 947],
  [12, 94, 7],
  [12, 9, 47],
  [12, 9, 4, 7],
  [1, 2947],
  [1, 294, 7],
  [1, 29, 47],
  [1, 29, 4, 7],
  [1, 2, 947],
  [1, 2, 94, 7],
  [1, 2, 9, 47],
  [1, 2, 9, 4, 7]
]

假设预期结果不依赖于顺序,空格表示二进制模式:

12947     => 0000
1294 7    => 0001
129 47    => 0010
…
1 29 47   => 1010
…
1 2 9 4 7 => 1111

我们可以将此模式与计数器一起使用,并将其转换为二进制字符串。我们还用以下内容填充该字符串0所以它总是保持 4 位数字长:

index.toString(2).padStart(arr.length - 1, "0")

For n digits in arr, there are exactly 2n - 1 combinations, so we use:

{length: 2 ** (arr.length - 1)}

This is an object that has a length property of 2arr.length - 1.

我们将这两件事结合成一个Array.from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from接受两个参数的调用:

  • 要转换为数组的对象
  • 映射每个槽的函数

用 a 转动物体length属性到数组中意味着我们创建一个数组length许多插槽。

映射函数接受槽的索引作为第二个参数。我们只使用索引 — 作为二进制数的计数器。

所以,最后整个表达式:

Array.from({length: 2 ** (arr.length - 1)}, (_, index) => index.toString(2).padStart(arr.length - 1, "0"))

计算结果为以下数组:

[
  "0000",
  "0001",
  "0010",
  "0011",
  "0100",
  "0101",
  "0110",
  "0111",
  "1000",
  "1001",
  "1010",
  "1011",
  "1100",
  "1101",
  "1110",
  "1111"
]

我们需要进一步将其映射到最终结果:

.map((binary) => …)

对于每个数组元素,binary是上面数组中的二进制字符串之一。

为了转动例如"0110"变成类似的东西"12,9,47", 我们需要map over arr以及。每个数字num from arr后面应该是, at position, iff binary is 1 at position:

arr.map((num, position) => num + (Number(binary[position]) ? "," : "")).join("")

表达方式(Number(binary[position]) ? "," : "")评估binary在指定位置作为数字。如果它是truthy,即除了0,它评估为",", 如果它是falsy, i.e. 0,它评估为"".

所以中间数组看起来像["1", "2,", "9,", "4", "7"]。所有这一切都结合在一起"12,9,47".

然后,与JSON.parse("[" ++ "]")它被当作一个数组来处理和解析,所以它变成了[12, 9, 47]。由于这些步骤适用于每个二进制字符串,因此您最终将得到最终结果。


  • 2 ** (arr.length - 1)可以替换为Math.pow(2, arr.length - 1)如果不支持 ECMAScript 7。
  • {length: 2 ** (arr.length - 1)}可以替换为new Array(2 ** (arr.length - 1)).
  • (Number(binary[position]) ? "," : "")可以替换为["", ","][Number(binary[position])]。在这种情况下,计算出的数字将用作临时数组的索引。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成数字数组中有效的数字组合 的相关文章

随机推荐

  • Windows NTFS 上的 Files.walkFileTree 与 Files.walk 性能比较

    我的应用程序 https komga org 需要定期扫描文件系统以处理文件 最初我使用的是java nio file Files walk执行扫描 但很快我就遇到了一些问题AccessDeniedException 发现 https ma
  • 如何使用 python API 列出所有数据流作业

    我的用例涉及获取项目中存在的所有流数据流作业的作业 ID 并取消它 更新我的数据流作业的源并重新运行它 我正在尝试使用 python 来实现这一点 直到现在我还没有遇到任何有用的文档 我想到使用 python 的库子进程来执行 gcloud
  • .mobileprovision 的 MIME 类型是什么

    mobileprovision 文件类型的正确 MIME 类型 IIS 是什么 我的想法正确吗 如果我必须将每个人的设备连接到 mac 开发机器来安装 mobileprovision 文件 那么它就违背了无线临时分发方法的目的 如果没有特定
  • 如何在状态栏中获得永久的应用程序通知程序?

    我在互联网上搜索了很多 但找不到正确的答案 我在 Android 手机上使用过 3G Watchdog 和 Advanced Task Killer 等应用程序 我注意到 当状态栏最小化时 它们总是有一个图标 并且还有一个无法从状态栏清除的
  • Bootstrap 模式隐藏不起作用

    Bootstrap 模式隐藏不起作用 警报来自其他地方 但我的模式没有隐藏添加了引导层 我的问题也是同样的问题
  • Google 地图 v3 地理编码服务器端

    我正在使用 ASP NET MVC 3 和 Google 地图 v3 我想在一个动作中进行地理编码 即将有效地址传递给 Google 并获取纬度和经度 我见过的所有关于地理编码的在线示例都涉及客户端地理编码 您将如何使用 C 在操作中执行此
  • 访问控制允许来源错误..(使用 cordova)

    我正在尝试网络服务器和客户端 混合应用程序 使用cordova 但是 Access Control Allow Origin 错误 所以我下载了 chrome 扩展程序 cors 但不起作用 服务器 js var app require e
  • 所有应用程序在断开连接时崩溃[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 突然之间 当我断开连接 iMac 和 iPhone 的电线时 我构建并发送到手机的任何应用程序都会立即崩溃 并且也没有任
  • 刷新物化视图时,索引是否也会自动刷新?

    我目前使用的是 Postgres 9 3 3 If you refresh物化视图 该物化视图上的索引是否也重新索引 或者是否需要手动重新索引索引 在查看以下内容时question https stackoverflow com quest
  • PHP服务器统计脚本? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我不太确定把这个问题放在哪里 它不是真正的网络应用程序或超级用户 但我确信类似的东西已经存在 我正在寻
  • 在android中使用Google Drive api获取在Google Drive上创建的文件的大小

    我创建了应用程序 使用该应用程序用户将能够从 Google 驱动器获取列表中的所有文件并能够下载它 现在 用户可以下载已上传到驱动器的文件 并带有进度计数 但我无法获取在 Goolge 驱动器上创建的文件的大小 例如文档 演示文稿 电子表格
  • Android UI 测试期间“未找到测试”

    如果我有时想通过右键单击测试然后选择运行来运行单个测试 测试结果将显示 未找到测试 并显示与 线程 main java lang NoClassDefFoundError 中的异常 相关的错误 我发现这种情况只发生过几次 为什么会发生这种情
  • C++迭代器和反向迭代器

    我正在写一个iterator 实际上是const iterator对于我当前的对象 我还想创建一个reverse const iterator also 我环顾四周 想看看如何做到这一点 然后我偶然发现this http www cplus
  • 在jsp页面中使用log4j的正确方法是什么

    我的意思是 我希望记录器名称反映 source jsp 文件 无论它是否包含在另一个文件中或编译为类或其他文件 首先 导入所需的包 即 then the jsppagename jsp根据您使用的服务器 可能会发生变化 然后 在 jsp 内
  • GZip 算法如何工作? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 GZip 文件压缩算法如何工作 如果有人有这方面的任何文档 我想阅读它 如果您仍在寻找更详细的概述 我已经在以下位置编写了 gzip de
  • Django 对象.update_or_create

    我有一个在 celery 中运行的 period task 来查询最新的加密货币价格 但由于某种原因 每次想要显示数据时 我没有得到更新的记录 我只是得到新的记录 而旧的记录由于某种原因被保留 tasks py periodic task
  • NavigationView如何处理动态标题内容

    我有一个非常标准的 NavigationView 当我在标题中使用静态布局 如下所示 时 效果非常好
  • 约束布局 - 具有最大宽度的两个视图

    我想创建一个布局 使用约束布局 如下所示 在不同的语言中 Button1 可能比 Button2 大 我怎样才能做到这一点 我只能在包含两个按钮的约束内使用 LinearLayout 来实现此目的 但我尝试仅使用布局 Thanks Upda
  • 如果主体参数以“@”开头,则发出 PowerShell POST 请求

    我想在 PowerShell 中发出 POST 请求 以下是 Postman 中的正文详细信息 type login username email protected cdn cgi l email protection password
  • 生成数字数组中有效的数字组合

    我正在尝试从数字数组中生成所有有效的数字组合 假设我们有以下内容 let arr 1 2 9 4 7 我们需要输出这样的内容 1 2 9 4 7 1 2 9 47 1 2 94 7 1 2 947 1 29 4 7 1 29 47 1 29