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

这篇具有很好参考价值的文章主要介绍了【华为OD机试真题 C++ Java Python】1、滑动窗口最大值 | 机试真题+思路参考+代码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


🍂个人博客首页: KJ.JK
 
🍂专栏介绍: 定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏每篇的文章都会将使用C++、Python、Java三种语言进行更新解答,每个题目的思路分析都非常详细,超过百字欢迎大家订阅学习,代码可以直接运行使用


一、题目


🎃题目描述

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


🎃输入输出

输入
第一行输入一个正整数N,表示整数个数。(0<N<100000)
第二行输入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

二、代码与思路参考


🎈C++语言思路


1、读取输入的整数N,表示数组的长度

2、读取输入的整数数组元素,将其存储在一个名为arr的向量中

3、读取输入的整数M,表示滑动窗口的长度

4、初始化变量window_sum为前M个元素的和,即窗口的初始和

5、初始化变量max_sum为window_sum,表示当前的最大和

6、从M开始,通过遍历数组来移动滑动窗口

  • 在每个位置i,通过将窗口最左边的元素移出窗口并将窗口最右边的元素移入窗口,更新window_sum的值
  • 检查window_sum是否大于max_sum,如果是,则将max_sum更新为window_sum

7、遍历完成后,max_sum将包含滑动窗口的最大和

8、输出max_sum作为结果


🎉C++代码
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int N;
    cin >> N; // 输入N
    
    vector<int> arr(N);
    for (int i = 0; i < N; i++) {
        cin >> arr[i]; // 输入数组元素
    }
    
    int M;
    cin >> M; // 输入M
    
    int window_sum = 0;
    for (int i = 0; i < M; i++) {
        window_sum += arr[i]; // 计算初始窗口和
    }
    
    int max_sum = window_sum; // 初始化最大和为初始窗口和
    
    for (int i = M; i < N; i++) {
        window_sum = window_sum - arr[i - M] + arr[i]; // 更新窗口和,减去窗口最左边的元素,加上窗口最右边的元素
        max_sum = max(max_sum, window_sum); // 更新最大和
    }
    
    cout << max_sum << endl; // 输出最大和
    
    return 0;
}



🎈Java语言思路


1、首先,从输入中获取数组的长度 N,并创建一个大小为 N 的整数数组 arr

2、使用循环,将输入的 N 个整数依次存储到数组 arr 中

3、获取窗口大小 M

4、初始化一个变量 windowSum 为 0,用于存储当前窗口内元素的和

5、使用一个循环,计算初始窗口大小为 M 的子数组的和,并将结果存储在 windowSum 变量中

6、将 windowSum 的值赋给变量 maxSum,作为初始的最大窗口和

7、使用另一个循环,从第 M 个元素开始,不断移动滑动窗口。在每次迭代中,更新窗口和 windowSum,通过减去窗口最左端的元素并加上窗口最右端的元素。然后,使用 Math.max 方法将 windowSum 和 maxSum 的较大值更新到 maxSum 变量中

8、循环结束后,maxSum 中存储的就是整个数组中连续子数组的和的最大值

9、最后,输出 maxSum 的值,即最大窗口和


🎉Java代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();  // 输入数组的长度
        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = scanner.nextInt();  // 输入数组元素
        }
        int M = scanner.nextInt();  // 窗口大小

        int windowSum = 0;  // 窗口内元素的和
        for (int i = 0; i < M; i++) {
            windowSum += arr[i];  // 计算初始窗口和
        }
        int maxSum = windowSum;  // 初始最大窗口和

        for (int i = M; i < N; i++) {
            windowSum = windowSum - arr[i - M] + arr[i];  // 更新窗口和
            maxSum = Math.max(maxSum, windowSum);  // 更新最大窗口和
        }

        System.out.println(maxSum);  // 输出结果
    }
}



🎈Python语言思路


给定一个长度为N的数组和窗口大小M,我们需要找到滑动窗口产生的所有窗口和的最大值。

我们可以使用滑动窗口的技巧来解决这个问题。首先,我们计算数组的前M个元素的和,作为初始窗口和的值。然后,我们从第M+1个元素开始,每次向右移动一个位置,同时更新窗口和的值。

具体步骤如下:

1、输入数组的长度N和数组元素

2、输入窗口大小M

3、计算初始窗口和的值,即数组的前M个元素的和

4、初始化一个变量max_sum为初始窗口和的值

5、从第M+1个元素开始,进行以下循环:

   窗口和的值减去滑出窗口的第一个元素,加上滑入窗口的下一个元素,更新窗口和的值
   如果当前窗口和的值大于max_sum,则更新max_sum为当前窗口和的值

6、输出max_sum作为结果文章来源地址https://www.toymoban.com/news/detail-715151.html


🎉Python代码
N = int(input())
arr = list(map(int, input().split()))
M = int(input())

window_sum = sum(arr[:M])
max_sum = window_sum

for i in range(M, N):
    window_sum = window_sum - arr[i - M] + arr[i]
    max_sum = max(max_sum, window_sum)

print(max_sum)


作者:KJ.JK

到了这里,关于【华为OD机试真题 C++ Java Python】1、滑动窗口最大值 | 机试真题+思路参考+代码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为OD机试真题 Java 实现【矩阵最大值】【2023 B卷 100分】,附详细解题思路

    给定一个仅包含0和1的N*N的二维矩阵,请计算二维矩阵的最大值。 计算规则如下: 1、每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。 2、允许通过向左或向右整体循环移动每行元素来改变各元素在行

    2024年02月08日
    浏览(41)
  • 华为OD机试真题-2023(B卷)-【C++ Java Python】

    我是一名软件开发培训机构的老师,我的学生已有上百人通过了华为OD考试,学生们每次考完都会在群里分享交流机试题目。我会持续收集整理机试真题,帮助更多的学生通过考试!每道题目包含C++,Java,Python三种解法。 2023.5月,华为OD机试题目更新为: OD统一考试B卷 ,

    2024年02月09日
    浏览(32)
  • 2023华为OD机试真题【区间交叠/贪心算法】【Python Java C++】

    给定坐标轴上的一组线段,线段的起点和终点均为整数并且长度不小于1,请你从中找到最少数量的线段,这些线段可以覆盖住所有线段。 输入描述 第一行输入为所有线段的数量,不超过10000,后面每行表示一条线段,格式为”x,y”, x和y 分别表示起点和终点,取值范围是

    2024年02月13日
    浏览(40)
  • 2023华为OD机试真题【计算数组中心位置】【Java Python C++】

    给你一个整数数组nums,请计算数组的中心位置。数组的中心位置是数组的一个下标, 其左侧所有元素相乘的积等于右侧所有元素相乘的积。数组第一个元素的左侧积为1,最后一个元素的右侧积为1。 如果数组有多个中心位置,应该返回最靠近左边的那一个,如果数组不存在

    2024年02月15日
    浏览(32)
  • 华为OD机试真题2022&2023(Java C++ Python JS)目录汇总

    本文是华为OD机试真题(Python 语言) 专栏的目录贴(持续更新中…) 🔥2024华为OD机试真题(C C++ Java Py JS) B+C+D卷🔥 🔥2024华为OD机试真题(C语言) B+C+D卷🔥 🔥2024华为OD机试真题(Python语言) B+C+D卷🔥 🔥2024华为OD机试真题(Java 语言) B+C+D卷🔥 🔥2024华为OD机试真题(C++语言)B+C+D卷🔥

    2024年02月01日
    浏览(68)
  • 华为OD机试真题2022&2023(Java C++ Python JS)真题目录 + 考点 + 通过率

    本文是华为OD机试真题(Python 语言) 专栏的目录贴(持续更新中…) 🔥2024华为OD机试真题(C C++ Java Py JS) B+C+D卷🔥 🔥2024华为OD机试真题(C语言) B+C+D卷🔥 🔥2024华为OD机试真题(Python语言) B+C+D卷🔥 🔥2024华为OD机试真题(Java 语言) B+C+D卷🔥 🔥2024华为OD机试真题(C++语言)B+C+D卷🔥

    2024年02月05日
    浏览(63)
  • 【华为OD机试】矩阵最大值(python, java, c++, js)

    前言 :本专栏将持续更新华为OD机试题目,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于OD机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:nansun0903@163.com;备注:CSDN。 给定一个仅包含0和1的N*N的二维

    2024年02月11日
    浏览(38)
  • 华为OD机试真题- 区块链文件转储系统【2023Q2】【JAVA、Python、C++】

    题目描述: 区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2...Fn。随着时间的推移,所占存储会越来越大。 云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过

    2024年02月10日
    浏览(31)
  • 华为Od机试真题2023最新题库【A卷+B卷】(JAVA、Python、C++、JS)

    目录自动跳转到Java版解答,可在本专栏搜索Python版解答 1、11月之后,华为od考卷统一替换为【C+D卷】。新的题目由一部分以前考过的旧题库的题目+一部分全新题目(也就是今年才出的题目)题目组成。 2、如果时间紧迫,没有太多时间复习,建议直接从【C+D卷】开始刷。因为

    2024年02月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包