一、题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
题目:
给一个正整数数列 nums,一个跳数 jump,及幸存数量 left。
运算过程为:从索引0的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存 left 个数为止,然后返回幸存数之和。

输入描述:
第一行输入正整数数列
第二行输入跳数
第三行输入幸存数量
例子:
1,2,3,4,5,6,7,8,9
4
3

输出描述:
输出幸存数之和
例子:
从1(索引为0)开始起跳,中间跳过 4 个数字,因此依次删除 6,2,8,5,4,7。剩余1,3,9,返回和为13

二、题解

Java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package org.stone.study.algo.ex202411;

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class SumOfLeft {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 1 2 3 4 5 6 7 8 9
int[] arr = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 4
int jump = scanner.nextInt();
// 3
int left = scanner.nextInt();

int ans = sumLeft(arr, jump, left);
// 13
System.out.println("ans:" + ans);
}

/**
* 跳跃求剩余和
* @param arr 数组
* @param jump 跳跃步长
* @param left 剩余个数
* @return 求剩余和
*/
public static int sumLeft(int[] arr, int jump, int left) {
// 把 arr 变成 list 方便操作
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());

int index = 0;
while(list.size() > left) {
index = (index + jump + 1) % list.size();
// 依次删除 6,2,8,5,4,7
list.remove(index);
System.out.println("del: " + list.get(index));
// 因为删除了一个元素,所以 index 要减 1
--index;
}

// list:[1, 3, 9]
System.out.println("list:" + list);
return list.stream().mapToInt(Integer::intValue).sum();
}
}

python 实现


def sumOfLeft(nums, jump, left):
    
    temp = nums[:]
    index = 0
    while len(temp) > left:
        index = (index + jump + 1) % len(temp)
        del temp[index]
        # 因为删除了一个元素,所以 index 要减 1
        index -= 1

    return sum(temp)


if __name__ == "__main__":
    nums = list(map(int, input().split()))

    jump = int(input())
    left = int(input())

    print(sumOfLeft(nums, jump, left))