目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止,每次窗口滑动产生一个窗口和(窗口内所有数和和),求窗口滑动产生的所有窗口和的最大值。
二、输入描述
第一行输入一个正整数N,表示整数个数。(0<N<100000)
第二行输入N个整数,整数的取值范围为[-100,100]。
第三行输入一个正整数M,M代表窗口大小,M<=100000,且M<=N。
三、输出描述
窗口滑动产生的所有窗口和的最大值。
例如:
1、输入
6
10 20 30 15 23 12
3
2、输出
48
3、说明
窗口长度为3,窗口滑动产生的窗口和分别为10+20+30=60,20+30+15=65,30+15+23=68,15+23+12=50,所以窗口滑动产生的所有窗口和的最大值为68。
四、解题思路
- 第一行输入整数N;
- 第二行输入N个整数;
- 第三行输入滑动窗口大小M;
- 定义窗口滑动产生的所有窗口和的最大值max;
- 当滑动窗口大小为1时,取最大值即可;
- 使用 Arrays.stream() 方法将数组转换为流,然后使用 max() 方法获取最大值;
- 通过滑动窗口算法获取窗口滑动产生的所有窗口和的最大值。
五、Java算法源码
package com.guor.od;
import java.util.*;
public class OdTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 整数个数
int N = Integer.valueOf(sc.nextLine());
// N个整数
int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 窗口大小
int M = Integer.valueOf(sc.nextLine());
// 窗口滑动产生的所有窗口和的最大值
int max = Integer.MIN_VALUE;
// 当滑动窗口大小为1时,取最大值即可
if (M == 1) {
// 使用 Arrays.stream() 方法将数组转换为流,然后使用 max() 方法获取最大值
max = Arrays.stream(arr).max().getAsInt();
} else {
// 滑动窗口算法
for (int i = 0; i < N - M + 1; i++) {
int temp = 0;
for (int j = i; j < i + M; j++) {
temp += arr[j];
}
if (temp > max) {
max = temp;
}
}
}
System.out.println(max);
}
}
六、效果展示
1、输入
7
10 15 8 22 9 17 20
3
2、输出
48
3、说明
窗口长度为3,窗口滑动产生的窗口和分别为:
- 10 15 8 = 33
- 15 8 22 = 45
- 8 22 9 = 39
- 22 9 17 = 48
- 9 17 20 = 46
窗口滑动产生的所有窗口和的最大值是48。
🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。