题目描述
给一个正整数列nums,一个跳数jump,及幸存数量left。运算过程为:从索引为0的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1的数字,该数被敲出,并从该点起跳,以此类推,直到幸存left个数为止。然后返回幸存数之和。
约束:
-
0是第一个起跳点。
-
起跳点和命中点之间间隔jump 个数字,已被敲出的数字不计入在内。
-
跳到末尾时无缝从头开始(循环查找),并可以多次循环。
-
若起始时 left > len(nums) 则无需跳数处理过程。
/**
*
* @param nums 正整数数列,长度范围 [1,10000]
* @param jump 跳数,范围 [1,10000]
* @param left 幸存数量,范围 [1,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
思路
代码
public class Demo21 {
public static void main(String[] args) {
System.out.println(sumOfLeft(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9}, 4, 3));
}
/**
* @param nums 正整数数列,长度范围 [1, 10000]
* @param jump 跳数,范围 [1, 10000]
* @param left 幸存数量,范围 [0, 10000]
* @return 幸存数之和
*/
static int sumOfLeft(int[] nums, int jump, int left) {
List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList());
int sum = 0;
int start = 0;
int re = list.size() - left;
for (int i = 1; i <= re; i++) {
int index = (start + jump + 1) % list.size();
list.remove(index);
// 删除数字后起始位置。
start = index - 1;
}
for (Integer integer : list) {
sum += integer;
}
return sum;
}
}