📜  门|门CS 2010 |第 36 题(1)

📅  最后修改于: 2023-12-03 15:42:22.421000             🧑  作者: Mango

题目介绍

本题是 门|门CS 2010 的第 36 题,题目难度较大,需要仔细分析和处理。

题目描述:

给定 $n$ 个整数 $a_1, a_2, ..., a_n$ 以及一个正整数 $m$,请将 $a_i$ 与 $a_{i+m}$ 的和输出,其中下标从 1 开始。

要求实现一个函数 get_sum(n: int, a: List[int], m: int) -> List[int],其中:

  • n:整数 $n$,表示数组的长度 ($1 \leq n \leq 10^5$);
  • a:一个长度为 $n$ 的整数数组,表示 $n$ 个整数 ($-10^9 \leq a_i \leq 10^9$);
  • m:正整数 $m$,表示间隔距离 ($1 \leq m \leq n$);
  • 返回值:一个长度为 $\lfloor \frac{n}{m} \rfloor$ 的整数数组,表示两数之和。

思路分析

这道题目看上去比较简单,但是有一些细节需要注意。我们可以先构建一个 $\lfloor \frac{n}{m} \rfloor$ 长度的数组来存储结果。然后,我们考虑对原数组进行遍历,每隔 $m$ 个位置计算一次两数之和,将结果存储进我们的结果数组中。

但是,有一些细节需要注意:

  1. 计算两个数之和时,需要用 long long 类型来存储,否则会出现溢出。

  2. 当数组长度不是 $m$ 的整数倍时,最后一段需要单独计算。

代码实现

下面是本题的实现代码,代码语言为 Python:

from typing import List

def get_sum(n: int, a: List[int], m: int) -> List[int]:
    res = []
    t = n // m
    
    for i in range(t):
        sum_ = 0
        for j in range(m):
            sum_ += a[i * m + j] + a[(i+1) * m + j]
        res.append(sum_)
    
    if n % m != 0:
        sum_ = 0
        for i in range(n-m, n):
            sum_ += a[i]
        res.append(sum_)
        
    return res

以上就是本题的题目介绍、思路分析和Python实现代码。