我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

在这里插入图片描述

一、题目描述

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

游戏参与者需要分多个回合按顺序跳到第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;// 房子总格数countpublic static int count;// 选出索引和最小的那一组数据public static List 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());}public static void getMinSteps(int[] steps, int step, List list, List 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(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;// 房子总格数countprivate static int count;// 选出索引和最小的那一组数据private static List 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);}public static void getMinSteps(int[] steps, List 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 实现【比赛评分】【2023 B卷 100分】,附详细解题思路

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

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

在这里插入图片描述

来源地址:https://blog.csdn.net/guorui_java/article/details/131020654

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

一、题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏。 游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格,然后获得一次选房子的机会,直到所有房子都被选完,房子最多的人获胜。 跳房子的过程中,如果有踩线等违规行为会结束当前回合
2023-08-17

华为OD机试真题 Java 实现【字符串摘要】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述 二、输入描述 三、输出描述 四、解题思路 1、核心思路: 2、具体思路如下: 五、Java算法源码 六、效果展示
2023-08-17

华为OD机试真题 Java 实现【二维伞的雨滴效应】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 大家好,我是哪吒。 做技术,我是认真的,立志于打造最权威的华为OD机试真题专栏,帮助那些与我有同样需求的
2023-08-17

华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

目录 一、题目描述二、输入描述三、输出描述样例:输出样例: 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明4、再输入5、再说明6、如果走后一次请求的是20,会怎么样呢? 华为OD机试
2023-08-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录