目录
题目描述
输入描述
输出描述
用例
题目解析
算法源码
服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,
数组中每个元素都是单位时间内失败率数值,数组中的数值为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区间有
我们需要计算出这些区间的平均失败率容忍值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(" ");
}
下一篇:【selenium】三种等待方式