华为OD E卷(100分)54-查找接口成功率最优时间段
前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示。
数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数,给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值,即平均失败率小于等于minAverageLost.找出数组中最长时间段,如果未找到则直接返回NULL。
输入描述
有两行内容,
- 第一行为 minAverageLost,
- 第二行为数组,数组元素通过空格(" ")分隔, minAverageLost及数组中元素取值范围为0~100的整数,数组元素的个数不会超过100个
输出描述
找出平均值小于等于minAverageLost的最长时间段,输出数组下标对,格式{beginIndex}-{endIndex} (下标从0开始),
如果同时存在多个最长时间段,则输出多个下标对且下标对之间使用空格(” “)拼接,多个下标对按下标从小到大排序。
示例1
输入:
1
0 1 2 3 4
输出:
0-2
说明:
A、输入解释:minAverageLost=1,数组[0, 1, 2, 3, 4]
B、前3个元素的平均值为1,因此数组第一个至第三个数组下标,即0-2
示例2
输入:
2
0 0 100 2 2 99 0 2
输出:
0-1 3-4 6-7
说明:
A、输入解释:minAverageLost=2,数组[0, 0, 100, 2, 2, 99, 0, 2]
B、通过计算小于等于2的最长时间段为:数组下标为0-1即[0, 0],数组下标为3-4即[2, 2],数组下标为6-7即[0, 2],这三个部分都满足平均值小于等2的要求,因此输出0-1 3-4 6-7
题解
Java实现
package huawei.e100;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
/**
* @author arnold
* @date 2025年1月13日
* 查找接口成功率最优时间段
*
*/
public class T54 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int minAverageLost = sc.nextInt();
sc.nextLine();
String[] data = sc.nextLine().split(" ");
int[] d = new int[data.length];
for (int i = 0; i < d.length; i++) {
if (data[i].trim().length() >0) {
d[i] = Integer.parseInt(data[i].trim());
}
}
run(d, minAverageLost);
}
}
static void run(int[] data, int minAverageLost) {
Map<Integer, List<String>> res = new HashMap<Integer, List<String>>();
for (int i = 0; i < data.length; i++) {
int sum= data[i];
for (int j = i+1; j < data.length; j++) {
sum += data[j];
int avg = sum/(j-i+1);
if(avg <= minAverageLost) {
int len = j-i +1;
if(res.containsKey(len)) {
res.get(len).add(i+ "-" + j);
} else {
List<String> item = new ArrayList<String>();
item.add(i+ "-" + j);
res.put(len, item);
}
}
}
}
int maxLen = 0;
for(Integer k : res.keySet()) {
if (k> maxLen) {
maxLen = k;
}
}
System.out.println(String.join(" ", res.get(maxLen)));
}
}