目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、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);
// 如果未找到则直接返回NULL
if (!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在线答疑。