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

这篇具有很好参考价值的文章主要介绍了华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

华为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;
// 房子总格数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 实现【跳房子II】【2023 B卷 100分】,附详细解题思路


🏆下一篇:华为OD机试真题 Java 实现【比赛评分】【2023 B卷 100分】,附详细解题思路

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

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

华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路文章来源地址https://www.toymoban.com/news/detail-480035.html

到了这里,关于华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 300.【华为OD机试】跳房子I(时间字符串排序—Java&Python&C++&JS实现)

    本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年04月08日
    浏览(92)
  • 2023华为od机试真题B卷【矩阵稀疏扫描】Java 实现

             所有题目均有五种语言实现。 C实现目录 、 C++ 实现目录 、 Python实现目录 、 Java实现目录 、 JavaScript实现目录         如果矩阵中的许多系数都为零,那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省,并且在许多大的实践

    2024年02月08日
    浏览(38)
  • 华为OD机试真题Java实现【5键键盘的输出】真题+解题思路+代码(2022&2023)

    题目 有一个特殊的5键键盘,上面有a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键。a键在屏幕上输出一个字母a;ctrl-c将当前选择的字母复制到剪贴板;ctrl-x将当前选择的字母复制到剪贴板,并清空选择的字母;ctrl-v将当前剪贴板里的字母输出到屏幕;ctrl-a选择当前屏幕上的所有字母。

    2024年02月15日
    浏览(44)
  • 华为OD机试真题 Java 实现【端口合并】【2022.11 Q4 新题】

        所有题目均有五种语言实现。 C语言实现目录 、 C++ 实现目录 、 Python实现目录 、 Java实现目录 、 JavaScript实现目录 有 M(1=M=10) 个端口组 每个端口组是长度为 N(1=N=100)的整数数组,如果端口组间存在2个及以上不同端口相同,则认为这2个端口组 互相关联,可以合并

    2023年04月08日
    浏览(46)
  • 华为OD机试真题 Java 实现【字符统计】【2023 B卷 100分】

    华为OD机试 2023B卷题库疯狂收录中,刷题 点这里 输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。 数据范围:字符串长度满足 1≤len(str)≤1000 。 一个只包含小写英文字母和

    2024年02月07日
    浏览(51)
  • 华为OD机试真题B卷 Java 实现【查字典】,附详细解题思路

    华为OD机试 2023B卷题库疯狂收录中,刷题 点这里 输入一个单词前缀和一个字典,输出包含该前缀的单词。 单词前缀+字典长度+字典。 字典是一个有序

    2024年02月07日
    浏览(46)
  • 华为OD机试真题B卷 Java 实现【字符统计】,附详细解题思路

    华为OD机试 2023B卷题库疯狂收录中,刷题 点这里 输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。 数据范围:字符串长度满足 1≤len(str)≤1000 。 一个只包含小写英文字母和

    2024年02月07日
    浏览(54)
  • 华为OD机试真题B卷 Java 实现【寻找峰值】,附详细解题思路

    给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于; 2.假设 nums[-1] = nums[n] = -infty−∞; 3.对于所有有效的 i 都有 nums[i] !=

    2024年02月06日
    浏览(67)
  • 华为OD机试真题 Java 实现【打印文件】【2023Q1 100分】

    有 5 台打印机打印文件,每台打印机有自己的待打印队列。 因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的优先级,其中数字越大优先级越高。 打印机会从自己的待打印队列中选择优先级最高的文件来打印。 如果存在两个优先级一样的文件,则选择最早

    2024年02月07日
    浏览(42)
  • 华为OD机试真题 Java 实现【猜字谜】【2023Q1 100分】

    小王设计了一人简单的清字谈游戏,游戏的迷面是一人错误的单词,比如nesw,玩家需要猜出谈底库中正确的单词。猜中的要求如· 对于某个谜面和谜底单词,满足下面任一条件都表示猜中: 变换顺序以后一样的,比如通过变换w和e的顺序,“nwes”跟“news”是可以完全对应的

    2024年02月04日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包