华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

news2024/11/16 17:36:16

在这里插入图片描述

一、题目描述

跳房子,也叫跳飞机,是一种世界性的儿童游戏。

游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格,然后获得一次选房子的机会,直到所有房子都被选完,房子最多的人获胜。

跳房子的过程中,如果有踩线等违规行为会结束当前回合,甚至可能倒退几步。

假设房子的总格数是count,小红每回合可能连续跳的步数都放在数据steps中,请问数组中是否有一种步数的组合,可以让小红三个回合跳到最后一格?如果有,请输出索引和最小的步数组合,数据保证索引和最小的步数组合是唯一的。

注意:数组中的步数可以重复,但数组中的元素不能重复使用。

二、输入描述

第一行输入为房子总格数count,它是整数类型int。

第二行输入为每回合可能连续跳过的步数,它是整数数组类型。

三、输出描述

返回索引和最小满足要求的步数组合。

注意:顺序保持steps中的原有顺序。

四、补充说明

  • count <= 10000;
  • 3 <= steps.length <= 10000;
  • -100000 <= steps[i] <= 100000;

五、解题思路

这道题的【题目描述】优点复杂,说的也不是很清晰。

简而言之,就是:

第一行输入一个数count;

第二行输入若干个数steps;

将第二行中的数字,以任意组合的方式(保证三个回合跳到最后一格),等于count即可,看看一共有多少种,然后选出索引和最小的那一组数据,按顺序输出即可

万丈高楼平地起,稳扎稳打,先理清思路,找准方向,再动手。

  1. 输入房子总格数count;
  2. 输入每回合可能连续跳过的步数;
  3. 递归选出索引和最小的那一组数据;
    • 遍历steps数组中的数字,每三个数字进行依次递归;
    • 如果不满足条件,将第三个数字删除,再添加一个新的数字;
    • 再比较小红跳的步数集合是否等于count;
    • 循环往复
  4. 小红跳的步数集合等于count 且 选出索引和最小的那一组数据;
  5. 返回索引和最小满足要求的步数组合;

六、Java算法源码

// 最小索引和
public static int min = 100000;
// 三个回合跳到最后一格
public static int three = 3;
// 房子总格数count
public static int count;
// 选出索引和最小的那一组数据
public static List<Integer> minIndexList;

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    // 房子总格数count
    count = Integer.valueOf(sc.nextLine());
    // 每回合可能连续跳过的步数
    int[] steps = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();

    // 选出索引和最小的那一组数据
    getMinSteps(steps, three, new ArrayList<>(), new ArrayList<>(), 0);

    // 返回索引和最小满足要求的步数组合
    System.out.println(minIndexList.toString());
}

/**
 * 选出索引和最小的那一组数据
 *
 * @param steps     steps数组
 * @param step      步数
 * @param list      小红跳的步数集合
 * @param indexList 小红跳的步数的索引集合
 * @param index     当前步数索引
 */
public static void getMinSteps(int[] steps, int step, List<Integer> list, List<Integer> indexList, int index) {
    // 三个回合跳到最后一格
    if (step == 0) {
        int total = 0;
        int indexTotal = 0;
        // 三个回合跳到最后一格
        for (int i = 0; i < three; i++) {
            total += list.get(i);
            // 计算索引和
            indexTotal += indexList.get(i);
        }

        // 小红跳的步数集合等于count 且 选出索引和最小的那一组数据
        if (total == count && indexTotal < min) {
            // 符合要求的小红跳的步数集合
            System.out.println("符合要求的小红跳的步数集合:"+list);
            // 下角标之和
            System.out.println("下角标之和:"+indexTotal);
            min = indexTotal;
            minIndexList = new ArrayList<Integer>(list);
        }
    } else {
        // 遍历steps数组
        for (int i = index; i < steps.length; i++) {
            // 小红跳的步数集合
            list.add(steps[i]);
            // 小红跳的步数的索引集合
            indexList.add(i);
            // 选出索引和最小的那一组数据
            getMinSteps(steps, step - 1, list, indexList, i + 1);
            // 遍历steps数组中的数字,每三个数字进行依次递归,如果不满足条件,将第三个数字删除,再添加一个新的数字,再比较小红跳的步数集合是否等于count,循环往复
            list.remove(list.size() - 1);
            indexList.remove(indexList.size() - 1);
        }
    }
}

感觉很麻烦,能不能再优化优化?

// 最小索引和
private static int min = Integer.MAX_VALUE;
// 三个回合跳到最后一格
private static final int three = 3;
// 房子总格数count
private static int count;
// 选出索引和最小的那一组数据
private static List<Integer> minIndexList;

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 房子总格数count
    count = sc.nextInt();
    sc.nextLine();
    // 读取换行符
    int[] steps = Arrays.stream(sc.nextLine().split(","))
            .mapToInt(Integer::parseInt)
            .toArray();

    minIndexList = new ArrayList<>();
    getMinSteps(steps, new ArrayList<>(), 0, 0);
    System.out.println(minIndexList);
}

/**
 * 选出索引和最小的那一组数据
 *
 * @param steps         每回合可能连续跳过的步数数组
 * @param currentSteps  当前已跳的步数集合
 * @param currentIndex  当前步数索引和
 * @param sum           当前步数总和
 */
public static void getMinSteps(int[] steps, List<Integer> currentSteps, int currentIndex, int sum) {
    if (currentSteps.size() == three) {
        if (sum == count && currentIndex < min) {
            System.out.println("符合要求的小红跳的步数集合:"+currentSteps);
            System.out.println("下角标之和:"+currentIndex);
            min = currentIndex;
            minIndexList = new ArrayList<>(currentSteps);
        }
        return;
    }

    for (int i = 0; i < steps.length; i++) {
        // 尝试添加步数
        currentSteps.add(steps[i]);
        // 递归调用
        getMinSteps(steps, currentSteps, currentIndex + i, sum + steps[i]);
        // 回溯,移除最后一个步数
        currentSteps.remove(currentSteps.size() - 1);
    }
}

完美!

七、效果展示

1、输入

15
1,9,4,25,10,8,7,5

2、输出

[1, 4, 10]

3、说明

符合条件的步数集合有

[1, 9, 5]

它的下角标之和为:0 + 1 + 7 = 8

[1, 4, 10]

它的下角标之和为:0 + 2 + 4 = 6

因为 6<8,故输出[1, 4, 10]。

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【云短信平台优惠活动】【2023Q1 200分】

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路径规划算法:基于平衡优化器优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于平衡优化器优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于平衡优化器优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…

MySQL数据库从入门到精通学习第8天(数据表的查询)

数据表的查询 基本查询语句单表查询聚合函数查询多表连接查询子查询合并查询结果定义表和字段的别名使用正则表达式查询 基本查询语句 SELECT 语句非常的强大&#xff0c;是最常用的查询语句。他具有一个固定的格式&#xff0c;如下&#xff1a; SELECT 查询的内容 FROM 数据…

markdown标注

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

MySQL进阶 -- 存储过程 和 触发器

目录 存储过程介绍存储过程的基本语法变量系统变量用户自定义变量局部变量 if判断 存储过程 介绍 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合&#xff0c;可以直接调用这些集合&#xff08;存储过程&#xff09;&#xff0c;调用存储过程可以简化应用开发人…

系列一、MongoDB简介特点应用场景

一、概述 1.1、官方 翻译&#xff1a;MongoDB是一个文档型数据库&#xff0c;旨在方便应用开发和扩展。 1.2、百度百科 1.3、总结 MongoDB 是一个非关系型文档数据库。 二、特点 面向集合存储&#xff0c;易存储对象类型的数据&#xff1b;支持查询以及动态查询&#xff1b…

在 Python 中实现最小堆

树是一种非线性数据结构&#xff0c;其中元素排列在多个级别。 堆是一种基于树的数据结构。 它是一棵完全二叉树&#xff0c;即每个父节点都有两个子节点。 堆实现不同的算法&#xff0c;对其他结构进行排序&#xff0c;对队列进行优先排序等。 堆有两种类型 - 最大和最小。 …

【计算机组成原理·笔记】总线控制

总线控制 总线上连接多个部件&#xff0c;为了解决&#xff1a; 什么时候由哪个部件发送信息如何给信息传送定时如何防止信息丢失如何避免多个部件同时发送如何规定接受信息的部件 等一些列问题&#xff0c;需要总线控制线进行统一管理&#xff0c;这就是总线控制&#xff0…

必须有公网IP吗?内网穿透如何实现外网访问

很多中小型公司或个人都有将自己内网的服务、应用&#xff0c;如远程桌面、网站、数据库、公司的管理系统、FTP、管家婆、监控系统等等&#xff0c;发布到外网&#xff0c;实现异地访问的需求。但往往面临一个普遍的问题&#xff0c;就是没有公网IP&#xff0c;即没有IP v4的公…

KEYSIGHT是德DSOX4034A 示波器 350 MHz

KEYSIGHT是德DSOX4034A 示波器 350 MHz&#xff0c;是德4000 X 系列拥有一系列引以为傲的配置&#xff0c;包括采用了电容触摸屏技术的 12.1 英寸显示屏、InfiniiScan 区域触摸触发、100 万波形/秒捕获率、MegaZoom IV 智能存储器技术和标配分段存储器。 是德DSO-X4034A 主要特…

scrcpy: 在电脑上使用Android手机

文章目录 1. 目的2. 配置2.0 配置思路2.1 安装 scrcpy 2.02.2 添加 udev 规则2.3 手机设置权限2.4 开启 scrcpy 1. 目的 打算在电脑上使用手机上的 App&#xff0c;如京东读书&#xff0c;或QQ。不用电脑版对应软件的原因是&#xff0c;电脑上需要重新登录&#xff0c;有些软件…

JSP SSM 学生综合测评管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM 学生综合测评管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

零基础快速搭建私人影音媒体平台

目录 1. 前言 2. Jellyfin服务网站搭建 2.1. Jellyfin下载和安装 2.2. Jellyfin网页测试 3.本地网页发布 3.1 cpolar的安装和注册 3.2 Cpolar云端设置 3.3 Cpolar本地设置 4.公网访问测试 5. 结语 转载自cpolar极点云的文章&#xff1a;零基础搭建私人影音媒体平台【…

RabbitMQ集群架构模式

搭建Mirror镜像集群&#xff1a; 4369是erlang的发现端口 5672是rabbitmq的通信端口 15672是rabbitmq的可视化控制台的端口号 25672是erlang底层发送消息和分配消息的底层端口 firewall-cmd --zonepublic --add-port4369/tcp --permanent firewall-cmd --zonepublic --add-port…

Springboot+vue.js高校校园社交个人博客相册网站系统

基于java语言设计并实现了高校社交系统。该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用Springboot框架&#xff0c;选择MySQL作为后台数据库。系统主要包括用户、个人动态、个人相册、动态类型、留言板、交流论坛等功能模块。近几年来&#xff0c;由于计算机技术的快速…

chatgpt赋能python:Python列表中如何找出前三名成绩

Python列表中如何找出前三名成绩 在数据分析和编程中&#xff0c;Python语言被广泛使用。其中&#xff0c;列表是Python中最常用的数据类型之一。列表可以存储多个值&#xff0c;并且这些值可以是不同的数据类型。Python列表很强大&#xff0c;因为它提供了许多内置函数和方法…

划水2年半,薪资还没新人多,不要太真实...

上个月公司来了许多新面孔&#xff0c;其中一个是个00后&#xff0c;这位兄弟毕业后&#xff0c;在某软件公司干了一年&#xff0c;现在跳槽到我们公司薪资20K&#xff0c;已经超过公司很多老油条了。因为我和他年纪相差不大&#xff0c;所以和他聊得来&#xff0c;才知道&…

Educational Codeforces Round 149 (Rated for Div. 2)(A—D、F)

文章目录 A. Grasshopper on a Line1、问题2、分析3、代码 B. Comparison String1、问题2、分析3、代码 C. Best Binary String1、问题2、分析3、代码 D. Bracket Coloring1、问题2、分析3、代码 E. Playoff Fixing1、问题2、分析3、代码 F. Editorial for Two1、问题2、分析3、…

数据库期末复习(6)基于哈希和B+树的索引查询

免责声明 练习题没有答案 图片都是自己做的 仅供参考 可扩展哈希表和练习 笔记 数据库--- 索引结构 (2)--可扩展哈希表及增删查_旅僧的博客-CSDN博客 练习 首先默认 局部深度都是1 然后进行插入 之后分裂 按照课件上的操作进行。 线性哈希表

插入排序,选择算法与快速排序(c语言,Java语言)

插入排序 原理&#xff1a;从数组的第二个元素开始,将数组中的每一个元素按照&#xff08;升序或者降序&#xff09;规则插入到已排好序的数组中以达到排序的目的。 插入排序并不是将元素取出来&#xff0c;插入到合适位置&#xff0c;之后的元素的位置依次加一&#xff0c;而…

在职阿里8年,一个31岁女软件测试工程师的心声

简单的先说一下&#xff0c;坐标杭州&#xff0c;13届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; 其中成功的有4家&am…