Python代码实现:
【华为OD】C卷真题 100%通过:求幸存数之和 Python实现【思路+代码】-CSDN博客
C++代码实现:
【华为OD】C卷真题 100%通过:求幸存数之和 C/C++实现_求幸存数之和 java 中间跳过-CSDN博客
Java代码实现:
【华为OD】C卷真题 100%通过:求幸存数之和 Java实现【思路+代码】-CSDN博客
C语言代码实现:
【华为OD】C卷真题 100%通过:求幸存数之和 C语言代码实现【思路+代码】-CSDN博客
给一个正整数列 nums,一个跳数 jump,及幸存数量 left。运算过程为:从索引为0的位置开始向后跳,中间跳过 J 个数字,命中索引为J+1的数字,该数被敲出,并从该点起跳,以此类推,直到幸存left个数为止。然后返回幸存数之和。
约束:
1)0是第一个起跳点。
2)起跳点和命中点之间间隔 jump 个数字,已被敲出的数字不计入在内。
3)跳到末尾时无缝从头开始(循环查找),并可以多次循环。
4)若起始时 left>len(nums) 则无需跳数处理过程。
/**
* nums: 正整数数列,长度范围 [1,10000]
* jump: 跳数,范围 [1,10000]
* left: 幸存数量,范围 [0,10000]
* return: 幸存数之和
*/
int sumOfLeft(int[] nums,int jump,int left)
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
[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
5
+---+
| |
| | 3 3 |---|
| | | |
| +---+ ----- + ---+ | |
| + | | | | + |----|3 | |
+ 2 | + | | 2 | | 2 + | | | |
+ | + | | | | + | | | |
+ +---+ + | | ----+ | +---+ + | | | |
+ | + | | | | | | + | | ++++++| | |
+ 1 | + | 1 | 1 | | 1 | | 1 + | | | | | |
+ | + | | | | | | + | | | | | |
+ +---+ + +---+ | +---+ +---+ +---+ + | | | | | |
+ | + | | | | + | | | | | |
+ 0 | + | 0 | 0 | | 0 + | | | | | |
+ | + | | | | + | | | | | |
+---+ + +-------+ +---+ + +--- | |+ | |++ | |+
+
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
要模拟跳的过程,可以通过累计大于0的元素,或者使用删除的方式,本题为了保证效率,使用了修改为负数的方式来模拟删除,然后统计大于0的元素来模拟跳即可。
function sumOfLeft(nums, numsLen, jump, left) {
let len = numsLen;
let count = 0;
let index = 0;
while (left < len) {
if (count <= jump) {
if (nums[index] > 0) {
count++;
}
} else if (nums[index] > 0) {
nums[index] = -200;
len--;
count = 1;
}
index++;
index = index % numsLen;
}
let ans = 0;
for (let i = 0; i < numsLen; i++) {
if (nums[i] > 0) {
ans += nums[i];
}
}
return ans;
}
// 测试用例
let arr = [1,2,3,4,5,6,7,8,9];
let jmp = 4;
let left = 3;
console.log(sumOfLeft(arr,arr.length,jmp,left));