华为机试 - 查找接口成功率最优时间段
创始人
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(" ");
}

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...