华为OD机试真题 JavaScript 实现【组装新的数组】【2023Q1 200分】

在这里插入图片描述

目录

    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、补充说明
    • 五、解题思路
    • 六、JavaScript算法源码
    • 七、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

一、题目描述

给你一个整数M和数组N,N中的元素为连续整数,要求根据N中的元素组装成新的数组R。

组装规则:

  1. R中元素总和加起来等于M;
  2. R中的元素可以从N中重复选取;
  3. R中的元素最多只能有1个不在N中,且比N中的数字都要小(不能为负数)

二、输入描述

第一行输入是连续数组N,采用空格分隔;
第二行输入数字M;

三、输出描述

输出的是组装办法数量,int类型。

四、补充说明

1 <= N.length <= 30
1 <= N.length <= 1000

五、解题思路

  1. 读取输入的连续数组 N 和数字 M
  2. 将连续数组 N 转换为整数数组 arr
  3. 初始化变量 sum 表示组装办法数量,初始值为 0。
  4. 初始化变量 min 表示数组 N 中的最小值,初始值为正无穷大。
  5. 遍历数组 N,将每个元素转换为整数,并更新 min 的值为数组 N 的最小值。
  6. 调用递归函数 get(0, arr, M, 0),计算组装办法数量。
  7. 在递归函数 get 中,如果当前新数组 R 的数字之和等于 M,则将 sum 加 1。
  8. 如果当前新数组 R 的数字之和大于 M,则返回。
  9. 如果 M - rSum <= min - 1,表示剩余的数字和已经小于等于 min - 1,则将 sum 加 1,并返回。
  10. 否则,从当前索引 idx 开始遍历数组 N,递归调用 get 函数,更新索引 idx 和新数组 R 的数字之和 rSum
  11. 最后,输出组装办法数量 sum

六、JavaScript算法源码

function countAssemblyMethods(N, M) {
  let sum = 0;
  let min = Infinity;

  function get(idx, n, M, rSum) {
    if (rSum === M) {
      sum++;
      return;
    }

    if (rSum > M) {
      return;
    }

    if (M - rSum <= min - 1) {
      sum++;
      return;
    }

    for (let i = idx; i < n.length; i++) {
      get(i, n, M, rSum + n[i]);
    }
  }

  const arr = N.split(" ").map(Number);
  min = Math.min(...arr);
  get(0, arr, M, 0);
  return sum;
}

七、效果展示

1、输入

2 3 5
8

2、输出

5

3、说明

  1. 2 2 2 2
  2. 2 3 2 1
  3. 2 5 1
  4. 3 5
  5. 2 3 3

下一篇:华为OD机试真题 JavaScript 实现【贪心的商人】【2023Q1 100分】

本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,javascript,开发语言,前端,ecmascript)