ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

华为OD机考往年真题 - 查找接口成功率最优时间段

华为OD机考往年真题 - 查找接口成功率最优时间段 2026年在考真题2026年目前正在考的真题目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解文章目录2026年在考真题题目描述输入描述输出描述示例1示例2解题思路最长满足平均失败率的时间段解题步骤C题目描述服务之间交换的接口成功率作为服务调用关键质量特性某个时间段内的接口失败率使用一个数组表示数组中每个元素都是单位时间内失败率数值数组中的数值为0~100的整数给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值即平均失败率小于等于minAverageLost找出数组中最长时间段如果未找到则直接返回NULL。输入描述输入有两行内容第一行为{minAverageLost}第二行为{数组}数组元素通过空格(” “)分隔minAverageLost及数组中元素取值范围为0~100的整数数组元素的个数不会超过100个。输出描述找出平均值小于等于minAverageLost的最长时间段输出数组下标对格式{beginIndex}-{endIndx}(下标从0开始)如果同时存在多个最长时间段则输出多个下标对且下标对之间使用空格(” “)拼接多个下标对按下标从小到大排序。示例1输入1 0 1 2 3 4输出0-2说明输入解释minAverageLost1数组[0, 1, 2, 3, 4]前3个元素的平均值为1因此数组第一个至第三个数组下标即0-2示例2输入2 0 0 100 2 2 99 0 2输出0-1 3-4 6-7说明输入解释minAverageLost2数组[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解题思路最长满足平均失败率的时间段这道题的核心是寻找数组中最长的连续子数组要求该子数组的平均值小于等于给定的容忍阈值minAverageLost。解题步骤前缀和预处理首先计算数组的前缀和这样可以在O(1)时间内计算出任意区间的元素和。前缀和数组prefixSum[i]表示原数组从索引0到i的所有元素之和。枚举所有可能的区间使用两重循环遍历所有可能的起始位置和结束位置。对于每个区间 [start, end]通过前缀和快速计算该区间的元素和sum prefixSum[end] - (start 0 ? prefixSum[start-1] : 0)计算区间长度length end - start 1判断该区间的平均值是否满足条件sum / length minAverageLost实际实现中为避免浮点数比较可转化为sum length * minAverageLost记录最长满足条件的区间如果当前区间满足条件且长度大于之前记录的最长区间更新最长区间记录。如果当前区间满足条件且长度等于当前记录的最长区间将该区间添加到结果集。输出结果如果没有找到满足条件的区间输出 “NULL”。否则按照起始索引排序后输出所有最长区间。C#includeiostream#includevector#includesstream#includealgorithmusing namespace std;intmain(){// 容忍的平均失败率inttoleratedAverageLoss;cintoleratedAverageLoss;// 读取失败率数组vectorintfailureRates;string line;getline(cinws,line);istringstreamiss(line);intnum;while(issnum){failureRates.push_back(num);}intarrayLengthfailureRates.size();// 创建一个累积和数组用于快速计算任意时间段的失败率总和vectorintcumulativeSum(arrayLength);cumulativeSum[0]failureRates[0];for(inti1;iarrayLength;i)cumulativeSum[i]cumulativeSum[i-1]failureRates[i];// 存储满足条件的时间段的开始和结束索引vectorpairint,intvalidPeriods;intmaxLength0;for(intstart0;startarrayLength;start){for(intendstart;endarrayLength;end){intsumstart0?cumulativeSum[end]:cumulativeSum[end]-cumulativeSum[start-1];intlengthend-start1;inttoleratedLosslength*toleratedAverageLoss;// 如果这个时间段的平均失败率小于等于容忍的平均失败率if(sumtoleratedLoss){// 如果这个时间段比之前找到的时间段更长清空结果列表并添加这个时间段if(lengthmaxLength){validPeriods.clear();validPeriods.push_back({start,end});maxLengthlength;}// 如果这个时间段和之前找到的最长时间段一样长添加这个时间段elseif(lengthmaxLength){validPeriods.push_back({start,end});}}}}// 如果没有找到满足条件的时间段输出NULLif(validPeriods.empty()){coutNULLendl;}// 否则输出所有满足条件的时间段else{sort(validPeriods.begin(),validPeriods.end());for(autoperiod:validPeriods){coutperiod.first-period.second ;}coutendl;}return0;}文章目录2026年在考真题题目描述输入描述输出描述示例1示例2解题思路最长满足平均失败率的时间段解题步骤C
返回列表