【华为OD】C卷真题 100%通过:求幸存数之和 JS代码实现【思路+代码】

 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

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

[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的元素来模拟跳即可。

JS代码实现:


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));

【华为OD】C卷真题 100%通过:求幸存数之和 JS代码实现【思路+代码】_第1张图片

你可能感兴趣的:(杂谈,算法,数据结构,华为od,c语言,javascript,C++,java)