一、题目描述
跳房子,也叫跳飞机,是一种世界性的儿童游戏。
游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格,然后获得一次选房子的机会,直到所有房子都被选完,房子最多的人获胜。
跳房子的过程中,如果有踩线等违规行为会结束当前回合,甚至可能倒退几步。
假设房子的总格数是count,小红每回合可能连续跳的步数都放在数据steps中,请问数组中是否有一种步数的组合,可以让小红三个回合跳到最后一格?如果有,请输出索引和最小的步数组合,数据保证索引和最小的步数组合是唯一的。
注意:数组中的步数可以重复,但数组中的元素不能重复使用。
二、输入描述
第一行输入为房子总格数count,它是整数类型int。
第二行输入为每回合可能连续跳过的步数,它是整数数组类型。
三、输出描述
返回索引和最小满足要求的步数组合。
注意:顺序保持steps中的原有顺序。
四、补充说明
- count <= 10000;
- 3 <= steps.length <= 10000;
- -100000 <= steps[i] <= 100000;
五、解题思路
这道题的【题目描述】优点复杂,说的也不是很清晰。
简而言之,就是:
第一行输入一个数count;
第二行输入若干个数steps;
将第二行中的数字,以任意组合的方式(保证三个回合跳到最后一格),等于count即可,看看一共有多少种,然后选出索引和最小的那一组数据,按顺序输出即可。
万丈高楼平地起,稳扎稳打,先理清思路,找准方向,再动手。
- 输入房子总格数count;
- 输入每回合可能连续跳过的步数;
- 递归选出索引和最小的那一组数据;
- 遍历steps数组中的数字,每三个数字进行依次递归;
- 如果不满足条件,将第三个数字删除,再添加一个新的数字;
- 再比较小红跳的步数集合是否等于count;
- 循环往复
- 小红跳的步数集合等于count 且 选出索引和最小的那一组数据;
- 返回索引和最小满足要求的步数组合;
六、JavaScript算法源码
let min = 100000; // 最小索引和
const three = 3; // 三个回合跳到最后一格
let count; // 房子总格数count
let minIndexList; // 选出索引和最小的那一组数据
function calculate(count, steps) {
getMinSteps(count, steps, three, [], [], 0);
return minIndexList;
}
function getMinSteps(count, steps, step, list, indexList, index) {
// 三个回合跳到最后一格
if (step === 0) {
let total = 0;
let indexTotal = 0;
// 三个回合跳到最后一格
for (let i = 0; i < three; i++) {
total += list[i];
// 计算索引和
indexTotal += indexList[i];
}
// 小红跳的步数集合等于count 且 选出索引和最小的那一组数据
if (total === count && indexTotal < min) {
min = indexTotal;
minIndexList = [...list];
// 打印符合要求的小红跳的步数集合和下角标之和
console.log("符合要求的小红跳的步数集合:" + list);
console.log("下角标之和:" + indexTotal);
}
} else {
// 遍历steps数组
for (let i = index; i < steps.length; i++) {
// 小红跳的步数集合
list.push(steps[i]);
// 小红跳的步数的索引集合
indexList.push(i);
// 选出索引和最小的那一组数据
getMinSteps(count, steps, step - 1, list, indexList, i + 1);
// 遍历steps数组中的数字,每三个数字进行依次递归,如果不满足条件,将第三个数字删除,再添加一个新的数字,再比较小红跳的步数集合是否等于count,循环往复
list.pop();
indexList.pop();
}
}
}
七、效果展示
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机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。