📅  最后修改于: 2023-12-03 15:42:12.706000             🧑  作者: Mango
这道题目是GATE CS 2021考试中设置的第50题,属于算法和数据结构的题目。本题需要考察程序员在编写程序时使用数组和循环结构的能力。
给出一个由$n$个整数组成的数组$A$和一个整数$k$。数组$B$的大小为$n-k-1$,其每个元素为$A$数组中对应位置之后的$k+1$个元素的平均值。请编写一个程序,计算出$B$数组的每个元素。
输入第一行为一个整数$n$,表示数组$A$的长度。
输入第二行为$n$个整数,表示数组$A$。
输入第三行为一个整数$k$。
输出一个长度为$n-k-1$的数组$B$。
6
1 2 3 4 5 6
2
3 4 5
对于每个元素$A[i]$,需要求解A[i + 1] … A[i + k]的平均值。这个平均值可以使用一个固定长度为$k + 1$的窗口,每次窗口向后平移一位,来计算。同时,由于只需要求出平均数,可以使用滑动窗口方法,将平均数计算的时间复杂度降为$O(1)$。最后得到的平均数就是数组$B$中的元素。
Python代码实现如下:
n = int(input())
a = list(map(int, input().split()))
k = int(input())
# 滑动窗口初始化
window_sum = sum(a[:k+1])
result = [window_sum/(k+1)]
# 滑动窗口计算每个平均值
for i in range(k+1, n):
window_sum += a[i] - a[i-k-1]
result.append(window_sum/(k+1))
print(' '.join(map(str, result)))
C++代码实现如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, k;
cin >> n;
vector<int> a(n);
for (auto& x : a) cin >> x;
cin >> k;
// 滑动窗口初始化
int window_sum = 0;
for (int i = 0; i <= k; i++)
window_sum += a[i];
cout << static_cast<double>(window_sum)/static_cast<double>(k+1) << ' ';
// 滑动窗口计算每个平均值
for (int i = k+1; i < n; i++)
{
window_sum += a[i] - a[i-k-1];
cout << static_cast<double>(window_sum)/static_cast<double>(k+1) << ' ';
}
cout << endl;
return 0;
}