如何在华为OD机试中获得满分?Java实现【组装新的数组】一文详解!

news/2024/7/23 16:27:49 标签: 算法, 华为, 面试, java, 开发语言

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)

文章目录

  • 1. 题目描述
    • 2. 输入描述
    • 3. 输出描述
    • 4. Java算法源码
    • 5. 测试
    • 6.解题思路![在这里插入图片描述](https://img-blog.csdnimg.cn/f108fb2640c349828939c7df9dc7191d.png)

1. 题目描述

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

组装规则:

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

2. 输入描述

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

3. 输出描述

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

补充:
1 <= N.length <= 30
1 <= N.length <= 1000

4. Java算法源码

java">/**
 * 给你一个整数M和数组N
 * 
 * N中的元素为连续整数,要求根据N中的元素组装成新的数组R
 * 
 * 1、R中元素总和加起来等于M
 * 2、R中的元素可以从N中重复选取
 * 3、R中的元素最多只能有1个不在N中,且比N中的数字都要小(不能为负数)
 */
// 组装办法数量
private static int sum = 0;
private static int min = Integer.MAX_VALUE;

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 连续数组N,采用空格分隔
    String[] N = sc.nextLine().split(" ");
    // 新数组R数字之和 = 数字M
    int M = sc.nextInt();

    // 数组N
    int[] arr = new int[N.length];
    for (int i = 0; i < N.length; i++) {
        arr[i] = Integer.parseInt(N[i]);
        // 取数组N的最小值
        min = Math.min(min, arr[i]);
    }
    get(0, arr, M, 0);
    System.out.println(sum);
}

/**
 *
 * @param idx
 * @param n 连续数组N,采用空格分隔
 * @param M 新数组R数字之和 = 数字M
 * @param rSum 新数组R数字之和
 */
public static void get(int idx, int[] n, int M, int rSum) {
    if (rSum == M) {
        sum++;
        return;
    }

    if (rSum > M) {
        return;
    }

    /**
     * R中的元素最多只能有1个不在N中,且比N中的数字都要小
     *
     * 新数组R数字之和 - 当前新数组R数字之和 <= 取数组N的最小值
     */
    if (M - rSum <= min - 1) {
        sum++;
        return;
    }

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

5. 测试

在这里插入图片描述

6.解题思路在这里插入图片描述

  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
    在这里插入图片描述

http://www.niftyadmin.cn/n/362079.html

相关文章

零碳光储 数能未来 | 全系光储产品实力吸睛,科士达精彩亮相SNEC 2023

5月24日&#xff0c;光伏行业最具影响力的全球性展会——“SNEC 2023”在上海盛大开幕。作为行业领先的全能方案供应商&#xff0c;科士达以“零碳光储 数能未来”为主题&#xff0c;携全系光储产品及解决方案重磅亮相。 展会现场&#xff0c;科士达展出的全系解决方案涵盖分布…

《汇编语言》- 读书笔记 - 第3章-寄存器(内存访问):mov、add、sub、push、pop

《汇编语言》- 读书笔记 - 第3章-寄存器&#xff08;内存访问&#xff09; 3.1 内存中字的存储问题 3.1 3.2 DS 和 [address]问题 3.2 3.3 字的传送问题 3.3问题 3.4 3.4 mov、add、sub 指令3.5 数据段问题 3.53.1~3.5 小结检测点 3.1 3.6 栈3.7 CPU 提供的栈机制问题 3.6 3.8 …

linux以www用户nologin情况下执行shell命令和配合git实践

在linux中建立网站时&#xff0c;我们一般分配一个www之类的用户给网站应用程序。 如果我们使用root或者具有管理员权限的账号在网站目录下去创建文件时&#xff0c;会遇到各种权限问题。 这时我们可以切换到www用户&#xff0c;这类用户一般是nologin&#xff0c;不允许登录。…

【TRT】使用TensorRT进行分类模型推理

1. pytorch 模型导出为onnx模型 1.1 pytorch 模型代码 import torch import torchvision import cv2 import numpy as npclass Classifier(torch.nn.Module):def __init__(self):super().__init__()#使用torchvision自带的与训练模型, 更多模型请参考:https://tensorvision.r…

23种设计模式之命令模式(Command Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的命令模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不…

郑州信源招标采购系统 定制

概述&#xff1a; 招标采购系统是郑州信源运用“互联网”、大数据、人工智能、区块链、物联网等新兴技术&#xff0c;结合供应链管理理念&#xff0c;以招标采购为核心&#xff0c;提供交易、管理、数据、服务、监管为一体的高标准采购管理平台&#xff0c;招标采购系统根据客户…

我用AI帮我唱了首“基尼太美”,颠覆了我的认知!太牛逼了

目录 前言 AI唱"基尼太美"是什么感觉 使用so-vits-svc打造自己专属歌手 1.声音素材整理 2.训练模型 3.让AI唱歌​编辑 AI歌手背后的技术 AI歌手会成为主流吗 写到最后 大家好&#xff0c;我是大侠&#xff0c;AI领域的专业博主 前言 在5月份&#xff0c;孙…

针对UDP协议的攻击与防御

一、UDP协议概述 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是TCP/IP协议栈中的一种无连接的传输协议&#xff0c;能够提供面向事务的简单不可靠数据传输服务。 1&#xff0e;UDP的报文格式 UDP的报文格式如图1所示。 图1 UDP报文格式 …