目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数,给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值,即平均失败率小于等于minAverageLost,找出数组中最长时间段,如果未找到则直接返回NULL。
二、输入描述
输入有两行内容,第一行为{minAverageLost},第二行为{数组},数组元素通过空格(” “)分隔,minAverageLost及数组中元素取值范围为0~100的整数,数组元素的个数不会超过100个。
三、输出描述
找出平均值小于等于minAverageLost的最长时间段,输出数组下标对,格式{beginIndex}-{endIndx}(下标从0开始),
如果同时存在多个最长时间段,则输出多个下标对且下标对之间使用空格(” “)拼接,多个下标对按下标从小到大排序。
四、解题思路
- 第一行输入minAverageLost;
- 第二行输入一个数组,逗号隔开;
- 进行非法判断,minAverageLost及数组中元素取值范围为0~100的整数;
- 通过java8 Stream表达式(简洁/方便/上档次)快速拆解输入行;
- 递归找出平均值小于等于minAverageLost的最长时间段,输出数组下标对,格式{beginIndex}-{endIndx}(下标从0开始);
- 遍历数组;
- 找出平均值小于等于minAverageLost的最长时间段,输出数组下标对;
- 如果未找到则直接返回NULL;
五、Java算法源码
package com.guor.od;import java.util.*;public class OdTest {// 找出平均值小于等于minAverageLost的最长时间段public static int minAverageLost = 0;// 是否找到平均失败率小于等于minAverageLost的最长时间段public static boolean flag = false;public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 找出平均值小于等于minAverageLost的最长时间段minAverageLost = Integer.parseInt(sc.nextLine());// minAverageLost取值范围为0~100的整数if(minAverageLost > 100){System.out.println("minAverageLost取值范围为0~100的整数");return;}// 第二行为{数组},数组元素通过空格(” “)分隔int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();dfs(0, arr);// 如果未找到则直接返回NULLif (!flag) {System.out.println("NULL");}}// 递归找出平均值小于等于minAverageLost的最长时间段,输出数组下标对,格式{beginIndex}-{endIndx}(下标从0开始)public static void dfs(int left, int arr[]) {// 一直到数组最后的if (left == arr.length){return;}int count = 0;double sum = 0.0;// 最右下角标int rightIndex = left;for (int i = left; i < arr.length; i++) {// 数组中元素取值范围为0~100的整数if(arr[i] < 0 || arr[i] > 100){System.out.println("数组中元素取值范围为0~100的整数");return;}sum += arr[i];count++;// 找出平均值小于等于minAverageLost的最长时间段,输出数组下标对if (sum / count <= minAverageLost) {rightIndex = i;}}if (rightIndex > left) {flag = true;System.out.print(left + "-" + rightIndex + " ");left = rightIndex;}dfs(left + 1, arr);}
}
六、效果展示
1、输入
4
1 3 5 7 9 7 5 3 1
2、输出
0-3 5-8
3、说明
1 3 5 7四个数的平均值是4,小于等于4,满足条件,输出0-3;
7 5 3 1四个数的平均值是4,小于等于4,满足条件,输出5-8;
如果同时存在多个最长时间段,则输出多个下标对且下标对之间使用空格(” “)拼接,多个下标对按下标从小到大排序。
故输出0-3 5-8
🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。