【华为OD机试真题 JS语言】1、滑动窗口最大值 | 机试真题+思路参考+代码解析

文章目录

    • 一、题目
      • 题目描述
      • 输入输出
      • 样例1
    • 二、思路参考
    • 三、代码参考
  • 作者:KJ.JK


个人博客首页: KJ.JK
 
专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用JS语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习


一、题目


题目描述

有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止,
 
每次窗口滑动产生一个窗口和(窗口内所有数的和),求窗口滑动产生的所有窗口和的最大值


输入输出

输入
第一行输入一个正整数N,表示整数个数。(0 第二行输入N个整数,整数的取值范围为[-100,100]。
第三行输入一个正整数M,M代表窗口的大小,M<=100000,且M<=N。
 
输出
窗口滑动产生所有窗口和的最大值


样例1

输入
6
12 10 20 30 15 23
3


输出
68

说明

窗口长度为3,窗口滑动产生的窗口和分别为10+20+30=6020+30+15=6530+15+23=6815+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();
    });
  });
});



作者:KJ.JK

你可能感兴趣的:(2023华为OD机试真题(JS,语言),B卷,华为od,javascript,开发语言,华为OD机试真题,滑动窗口最大值)