华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
跳房子,也叫跳飞机,是一种世界性的儿童游戏。
游戏的参与者需要步分个回合跳到第1格直到房子的最后一格。
跳房子的过程中,可以向前跳,也可以向后跳。
假设有若干步的步长数量是count,小红每回合可能连续跳的步数都放在数组steps中,请问数组中是否有一种步数的组合,可以让小红两个回合跳到最后一格?
如果有,请输出索引和最小的步数组合。
注意:
- 数组中的步数可以重复,但数组中的元素不能重复使用。
- 提供的数组保证存在满足题目要求的组合,且索引和最小的步数组合是唯一的。
二、输入描述
第一行输入为小红每回合可能连续跳的步数,它是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].
五、解题思路
这个问题可以看作是一个寻找两数之和的问题,但有一些特定的要求:
- 两数之和等于目标值: 我们需要找到两个步数的组合,这两个步数的和要等于给定的房子总格数 count。
- 不能使用相同的元素两次: 每次只能使用数组中的不同元素,即不能使用同一个步数元素的两个相同实例。
- 最小索引和: 如果存在多个组合满足条件,需要选择索引和最小的那个组合。
- 保证存在唯一解: 根据题目描述,保证有且仅有一个解满足条件。
详细解题步骤
- 初始化: 使用一个 minIndexSum 变量来存储最小的索引和,初始值设置为 Integer.MAX_VALUE。用一个 result 列表来存储最终满足条件的步数组合。
- 双重循环遍历数组: 使用两层循环来遍历 steps 数组的每一个可能的两步组合。外层循环变量 i 从0到 steps.length - 1,内层循环变量 j 从 i + 1 到 steps.length - 1。这确保了不会使用同一个元素两次,并且不会重复组合。
- 判断两步之和: 对于每一个组合 steps[i] 和 steps[j],计算其和并检查是否等于 count。这是核心的判断条件。
- 更新最小索引和: 如果找到了满足条件的步数组合,计算其索引和 i + j。如果这个索引和比当前的 minIndexSum 小,就更新 minIndexSum 并更新 result 为当前的步数组合。
- 输出结果: 最后,将找到的最小步数组合输出。
六、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在线答疑。