2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++)
题目描述
给一个正整数数列 nums,一个跳数 jump,及幸存数量 left。
运算过程为:从索引0的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存 left 个数为止,然后返回幸存数之和。
约束:
- 0是第一个起跳点
- 起跳点和命中点之间间隔 jump 个数字,已被敲出的数字不计入在内。
- 跳到末尾时无缝从头开始(循环查找),并可以多次循环。
- 若起始时 left > len(nums) 则无需跳数处理过程。
方法设计:
/**
* @param nums 正整数数列,长度范围 [1, 10000]
* @param jump 跳数,范围 [1, 10000]
* @param left 幸存数量,范围 [0, 10000]
* @return 幸存数之和
*
int sumOfLeft(int[] nums, int jump, int left)
输入描述
第一行输入正整数数列
第二行输入跳数
第三行输入幸存数量
输出描述
输出幸存数之和
用例1
输入
1,2,3,4,5,6,7,8,9
4
3
输出
13
说明
从1(索引为0)开始起跳,中间跳过 4 个数字,因此依次删除 6,2,8,5,4,7。剩余1,3,9,返回和为13
题目解析
本题考试时为核心代码模式,非ACM模式,即无需自己解析输入数据。
本代码实现仍然以ACM模式处理,但是会将输入处理 与 算法逻辑 分开,大家只看算法逻辑即可。
本题使用循环数组的思路去解题,循环遍历数组,直到剩余数字的个数符合要求。遍历到要剔除的数字时,将数字在数组中置零,剩余数字个数减1,下次再遍历0时,不计入跳过数的个数。
代码
c++
int sumOfLeft(vector<int> vec, int jump, int left) {
int n=vec.size();
int i=1;
int time=0;//统计每一轮