个人博客首页: KJ.JK
专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用JS语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习
有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止,
每次窗口滑动产生一个窗口和(窗口内所有数的和),求窗口滑动产生的所有窗口和的最大值
输入
第一行输入一个正整数N,表示整数个数。(0第二行输入N个整数,整数的取值范围为[-100,100]。
第三行输入一个正整数M,M代表窗口的大小,M<=100000,且M<=N。
输出
窗口滑动产生所有窗口和的最大值
输入
6
12 10 20 30 15 23
3
输出
68
说明
窗口长度为3,窗口滑动产生的窗口和分别为10+20+30=60,20+30+15=65,30+15+23=68,15+23+12=50,
所以窗口滑动产生的所有窗口和的最大值为68
1、首先,通过 readline 模块创建一个接口,用于从命令行获取用户输入。
2、然后,从用户输入中获取 N(数组长度),并将其转换为整数。
3、接下来,从用户输入中获取数组元素,并将其转换为一个数组(arr)。
4、再然后,从用户输入中获取 M(窗口大小),并将其转换为整数。
5、接下来,定义一个变量 window_sum,用于保存当前窗口的和。将其初始化为数组中前 M 个元素的和。
6、然后,定义一个变量 max_sum,用于保存最大和的值。将其初始化为 window_sum。
7、接下来,使用一个循环从 M 开始遍历数组,每次循环时,窗口右移一位。在右移时,从 window_sum 中减去窗口左边的元素,并加上窗口右边的元素。然后,比较 window_sum 和 max_sum 的值,取较大的值作为最大和。
8、最后,打印出最大和的值,并关闭 readline 接口。
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let N, arr, M;
rl.question("Enter N: ", (n) => {
N = parseInt(n);
rl.question("Enter array elements: ", (elements) => {
arr = elements.split(' ').map(Number);
rl.question("Enter M: ", (m) => {
M = parseInt(m);
// 计算初始窗口的和
let window_sum = arr.slice(0, M).reduce((a, b) => a + b, 0);
let max_sum = window_sum;
for (let i = M; i < N; i++) {
// 窗口右移时,减去左边元素,加上右边元素
window_sum = window_sum - arr[i - M] + arr[i];
max_sum = Math.max(max_sum, window_sum);
}
console.log(max_sum);
rl.close();
});
});
});