赞
踩
服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数,给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值,即平均失败率小于等于 minAverageLost,找出数组中最长时间段,如果未找到则直接返回NULL。
输入描述:
输入有两行内容,第一行为{minAverageLost},第二行为{数组},数组元素通过空格("")分隔,minAverageLost及数组中元素取值范围为0~100的整数,数组元素的个数不会超过100个。
输出描述:
找出平均值小于等于minAverageLost的最长时间段,输出数组下标对,格式{beginIndex}-{endlndx}(下标从0开始),如果同时存在多个最长时间段,则输出多个下标对且下标对之间使用空格("")拼接,多个下标对按下标从小到大排序。
示例1
输入
1
01234
输出
0-2
说明
A、输入解释:minAverageLost=1,数组[0,1,2,3.4]
B、前3个元素的平均值为1,因此数组第一个至第三个数组下标,即0-2
- import java.util.*;
-
- public class Main {
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
-
- // 读取输入的平均失败率容忍值和数组
- int minAverageLost = Integer.parseInt(scanner.nextLine()); // 读取平均失败率容忍值
- String[] rates = scanner.nextLine().split(" "); // 读取包含失败率的字符串并分割成数组
-
- int[] failures = Arrays.stream(rates).mapToInt(Integer::parseInt).toArray(); // 将字符串数组转换为整数数组
-
- List<String> result = new ArrayList<>(); // 用于存储结果的列表
-
- // 外层循环,遍历所有可能的起始位置
- for (int i = 0; i < failures.length; i++) {
- int sum = 0;
- // 内层循环,计算以当前起始位置开始的所有可能时间段
- for (int j = i; j < failures.length; j++) {
- sum += failures[j]; // 计算当前时间段内的失败次数总和
- double average = (double) sum / (j - i + 1); // 计算当前时间段的平均失败率
- if (average <= minAverageLost) { // 如果平均失败率小于等于容忍值
- if (result.isEmpty() || (j - i) > (Integer.parseInt(result.get(0).split("-")[1]) - Integer.parseInt(result.get(0).split("-")[0]))) {
- // 如果找到的时间段更长,则更新结果
- result.clear(); // 清空结果列表
- result.add(i + "-" + j); // 将当前时间段加入结果列表
- } else if ((j - i) == (Integer.parseInt(result.get(0).split("-")[1]) - Integer.parseInt(result.get(0).split("-")[0]))) {
- // 如果找到的时间段与已有最长时间段等长,则将其加入结果列表
- result.add(i + "-" + j);
- }
- }
- }
- }
-
- Collections.sort(result); // 对结果列表进行排序
-
- if (result.isEmpty()) {
- System.out.println("NULL"); // 如果结果列表为空,则输出"NULL"
- } else {
- System.out.println(String.join(" ", result)); // 输出结果列表中的内容
- }
- }
- }
解题思路:
我们的目标是找到一个或多个连续时间段,这些时间段内的平均失败率低于或等于给定的容忍值。下面是算法的解题思路:
- 从输入中读取平均失败率的容忍值和包含失败率的数组。
- 将输入的字符串数组转换为整数数组,方便后续计算。
- 创建一个列表(result)来存储符合条件的时间段。
- 使用两层循环遍历所有可能的时间段起始位置和结束位置:
- 外层循环遍历可能的起始位置 i
- 内层循环遍历以 i 为起始位置的所有可能结束位置 j
- 在内层循环中,计算从 i 到 j 的失败次数总和 sum,然后计算平均失败率 average
- 如果 average 小于等于容忍值,将当前时间段加入结果列表 result 中
- 对结果列表进行排序。
- 如果结果列表为空,则输出 "NULL";否则,输出结果列表中的内容。
这个算法的核心思想是通过两层循环遍历所有可能的时间段,计算出每个时间段的平均失败率,并找出符合条件的最长时间段。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。