华为OD机试 - 跳房子I(Java 2024 E卷 100分)

在这里插入图片描述

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

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

游戏的参与者需要步分个回合跳到第1格直到房子的最后一格。

跳房子的过程中,可以向前跳,也可以向后跳。

假设有若干步的步长数量是count,小红每回合可能连续跳的步数都放在数组steps中,请问数组中是否有一种步数的组合,可以让小红两个回合跳到最后一格?

如果有,请输出索引和最小的步数组合。

注意:

  1. 数组中的步数可以重复,但数组中的元素不能重复使用。
  2. 提供的数组保证存在满足题目要求的组合,且索引和最小的步数组合是唯一的。

二、输入描述

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

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

备注

  • count ≤ 1000
  • 0 ≤ steps.length ≤ 5000
  • -10000000 ≤ steps ≤ 10000000

三、输出描述

返回索引和最小的满足要求的步数组合 (顺序保持steps中原有顺序)

四、测试用例

测试用例1:

1、输入

[1,4,5,2,2]
7

2、输出

[5, 2]

3、说明

可行的两步组合有 [1, 2] (索引和 0+3=3)、[1, 2] (索引和 0+4=4)、[4, 2] (索引和 1+3=4)、[4, 2] (索引和 1+4=5)、[5, 2] (索引和 2+3=5)、[5, 2] (索引和 2+4=6)。

其中,[5, 2] 满足和等于 7,并且索引和最小(5,索引 2 和 3)。因此输出为 [5, 2]。

测试用例2:

1、输入

[-1,2,4,9,6]
8

2、输出

[-1, 9]

3、说明

此样例有多种组合满足两回合跳到最后,譬如[-1,9], [2,6],其中[-1,9]的索引和为0+3=3, [2,6]的索引和为1+4=5, 所以索引和最小的步数组合为[-1,9].

五、解题思路

这个问题可以看作是一个寻找两数之和的问题,但有一些特定的要求:

  1. 两数之和等于目标值: 我们需要找到两个步数的组合,这两个步数的和要等于给定的房子总格数 count。
  2. 不能使用相同的元素两次: 每次只能使用数组中的不同元素,即不能使用同一个步数元素的两个相同实例。
  3. 最小索引和: 如果存在多个组合满足条件,需要选择索引和最小的那个组合。
  4. 保证存在唯一解: 根据题目描述,保证有且仅有一个解满足条件。

详细解题步骤

  1. 初始化: 使用一个 minIndexSum 变量来存储最小的索引和,初始值设置为 Integer.MAX_VALUE。用一个 result 列表来存储最终满足条件的步数组合。
  2. 双重循环遍历数组: 使用两层循环来遍历 steps 数组的每一个可能的两步组合。外层循环变量 i 从0到 steps.length - 1,内层循环变量 j 从 i + 1 到 steps.length - 1。这确保了不会使用同一个元素两次,并且不会重复组合。
  3. 判断两步之和: 对于每一个组合 steps[i] 和 steps[j],计算其和并检查是否等于 count。这是核心的判断条件。
  4. 更新最小索引和: 如果找到了满足条件的步数组合,计算其索引和 i + j。如果这个索引和比当前的 minIndexSum 小,就更新 minIndexSum 并更新 result 为当前的步数组合。
  5. 输出结果: 最后,将找到的最小步数组合输出。

六、Java算法源码

public class OdTest03 {
    public static List<Integer> findMinimalStepCombination(int[] steps, int count) {
        List<Integer> result = new ArrayList<>();
        int minIndexSum = Integer.MAX_VALUE;

        // 使用双重循环来遍历所有可能的步数组合
        for (int i = 0; i < steps.length; i++) {
            for (int j = 0; j < steps.length; j++) {
                // 确保不同的元素,且计算和为count
                if (i != j && steps[i] + steps[j] == count) {
                    int indexSum = i + j;
                    // 如果找到更小的索引和,更新结果
                    if (indexSum < minIndexSum) {
                        minIndexSum = indexSum;
                        result.clear();
                        result.add(steps[i]);
                        result.add(steps[j]);
                    }
                }
            }
        }
        return result;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取步数数组
        String input = scanner.nextLine();
        String[] stepsStr = input.substring(1, input.length()-1).split(",");
        int[] steps = new int[stepsStr.length];
        for (int i = 0; i < stepsStr.length; i++) {
            steps[i] = Integer.parseInt(stepsStr[i]);
        }

        // 读取房子总格数
        int count = scanner.nextInt();

        // 计算结果并输出
        List<Integer> result = findMinimalStepCombination(steps, count);
        System.out.println(result);
    }
}

七、效果展示

1、输入

[3,1,4,2,6]
5

2、输出

[3, 2]

3、说明

可行的两步组合有 [3, 2] (索引和 0+3=3)、[1, 4] (索引和 1+2=3)。

[3, 2] 和 [1, 4] 都满足和等于 5,且索引和均为 3。根据原数组顺序第一个符合条件的组合是 [3, 2]。

按照题目要求保持顺序,因此输出为 [3, 2]。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 D卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值