华为机试 - 查找接口成功率最优时间段
创始人
2024-02-05 04:36:49
0次

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,

数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数,

给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值,即平均失败率小于等于minAverageLost,

找出数组中最长时间段,如果未找到则直接返回NULL。

输入描述

输入有两行内容,第一行为{minAverageLost},第二行为{数组},数组元素通过空格(” “)分隔,

minAverageLost及数组中元素取值范围为0~100的整数,数组元素的个数不会超过100个。

输出描述

找出平均值小于等于minAverageLost的最长时间段,输出数组下标对,格式{beginIndex}-{endIndx}(下标从0开始),

如果同时存在多个最长时间段,则输出多个下标对且下标对之间使用空格(” “)拼接,多个下标对按下标从小到大排序。

用例

输入1
0 1 2 3 4
输出0-2
说明

输入解释:minAverageLost=1,数组[0, 1, 2, 3, 4]

前3个元素的平均值为1,因此数组第一个至第三个数组下标,即0-2

输入2
0 0 100 2 2 99 0 2
输出0-1 3-4 6-7
说明

输入解释:minAverageLost=2,数组[0, 0, 100, 2, 2, 99, 0, 2]

通过计算小于等于2的最长时间段为:

数组下标为0-1即[0, 0],数组下标为3-4即[2, 2],数组下标为6-7即[0, 2],这三个部分都满足平均值小于等于2的要求,

因此输出0-1 3-4 6-7

题目解析

本题需要求出第二行输入的所有区间,比如0 1 2 3 4区间有

  • 0
  • 0~1, 1
  • 0~2, 1~2, 2
  • 0~3, 1~3, 2~3, 3
  • 0~4, 1~4, 2~4, 3~4, 4

我们需要计算出这些区间的平均失败率容忍值averageLost,和第一行输入的minAverageLost比较,

如果averageLost > minAverageLost,则不考虑

如果averageLost  <= minAverageLost,则考虑

最后将考虑中所有区间进行比较,保留最长的,注意可能有多个相同时间长度的。

这里模拟出上面区间,很明显需要使用双重for

for(let i=0; i

这里,我们为了避免陷入遍历j+1到i来计算区间[j+1, i]的总和,我们可以事先定义一个dp数组,dp[i]表示以0~i区间的总和。

因此[j+1, i]区间总和的计算就是dp[i] - dp[j]。

同时为了避免计算平均失败率,我们可以定义一个max数组,max[len]表示长度为len的区间的最大失败率,比如最小平均失败率容忍值是1,则长度为5的区间的最大失败率为5*1=5

算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
rl.on("line", (line) => {lines.push(line);if (lines.length === 2) {const minAverageLost = parseInt(lines[0]);const arr = lines[1].split(" ").map(Number);console.log(getMaxLen(arr, minAverageLost));lines.length = 0;}
});function getMaxLen(arr, minAverageLost) {const dp = [];dp[0] = arr[0];const max = [];for (let i = 1; i < arr.length; i++) {dp[i] = dp[i - 1] + arr[i];max[i] = i * minAverageLost;}max.push(arr.length * minAverageLost);let res = [];let maxLen = 0;for (let i = 0; i < arr.length; i++) {let ans;if (dp[i] <= max[i + 1]) {ans = [0, i];} else {for (let j = 0; j < i; j++) {if (dp[i] - dp[j] <= max[i - j]) {ans = [j + 1, i];break;}}}if (ans) {const ansLen = ans[1] - ans[0] + 1;if (ansLen > maxLen) {res = [ans];maxLen = ansLen;} else if (ansLen === maxLen) {res.push(ans);}}}if (!res.length) return "NULL";return res.map((range) => {const [i, j] = range;return i === j ? i : `${i}-${j}`;}).join(" ");
}

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...