华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集
题目描述
跳房子,也叫跳飞机,是一种世界性的儿童游戏。
游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格。跳房子的过程中,可以向前跳,也可以向后跳。
假设房子的总格数是count、小红每回合可能连续跳的步数都放在数组steps中,请问数组中是否有一种步数的组合,可以让小红两个回合跳到最后一格?如果有,请输出索引和最小的步数组合。
注意:数组中的步数可以重复,但数组中的元素不能重复使用。提供的数据保证存在满足题目要求的组合,且索引和最小的步数组合是唯一的。
输入描述
第一行输入为每回合可能连续跳的步数,它是int整数数组类型。实际字符串中整数与逗号间可能存在空格。
第二行输入为房子总格数count,它是int整数类型
输出描述
返回索引和最小的满足要求的步数组合(顺序保持steps中原有顺序)
示例1
输入:
[1,4,5,2,2]
7输出:
[5, 2]
示例2
输入:
[-1,2,4,9,6]
8输出:
[-1, 9]说明:
此样例有多种组合满足两回合跳到最后,比如:[-1,9],[2,6],其中[-1,9]的索引和为0+3=3,[2,6]的索和为1+4=5,所以索引和最小的步数组合[-1,9]
Java
import java.util.Arrays;
import java.util.Scanner;/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String line = in.nextLine();int s = line.indexOf('['), e = line.indexOf(']');int[] steps = Arrays.stream(line.substring(s + 1, e).split(",")).mapToInt(Integer::parseInt).toArray();int count = in.nextInt();int minIndexSum = Integer.MAX_VALUE; // 使用 MAX_VALUE 表示没有找到组合int[] rs = new int[2]; // 存储结果for(int i = 0; i < steps.length; i++){for(int j = i+1; j < steps.length; j++){if(i + j > minIndexSum || steps[i] + steps[j] != count) continue;minIndexSum = i + j;rs[0] = steps[i];rs[1] = steps[j];}}System.out.println("[" + rs[0] + ", " + rs[1] + "]");}
}
题解分析
这道题目是一个典型的组合问题,要求在给定的步数数组
steps
中找到两步的组合,使得跳到最后一格总共的步数恰好等于count
。并且,要求返回的是这两个步数的组合,同时保证其索引和最小。可以将这道题归类为“暴力枚举 + 条件判断”问题。通过遍历所有可能的两个步数组合,计算每个组合的和,如果满足条件(即和等于
count
),则进一步比较它们的索引和,更新答案。解题思路
- 输入解析:将输入的字符串(如
[1, 4, 5, 2, 2]
)解析成一个整数数组steps
。- 暴力枚举:使用两个嵌套的循环来枚举所有的步数组合。在内层循环中,检查两个步数之和是否等于
count
。- 条件判断:如果符合条件(两步之和等于
count
),进一步判断其索引和是否最小。如果是,更新答案。- 返回结果:最后输出符合条件的步数组合,并按照题目要求的格式返回。