当前位置: 首页> 健康> 美食 > 华为OD机试 - 跳房子I(Java 2024 E卷 100分)

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

时间:2025/7/17 0:56:12来源:https://blog.csdn.net/guorui_java/article/details/141881915 浏览次数:0次

在这里插入图片描述

华为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++) {// 确保不同的元素,且计算和为countif (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在线答疑。

在这里插入图片描述

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: