200字
查找接口成功率最优时间段
2025-12-06
2025-12-06

题目

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

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

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

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

输入描述

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

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

输出描述

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

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

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

1

0 1 2 3 4

输出

0-2

说明

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

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

总结

这个题目本质是一个满足平均值条件的最大长度子数组搜索问题,重点在于正确理解和处理边界条件,以及高效计算子数组平均值。

def find_max_length_subarrays(minAvg, arr):
    n = len(arr)
    if n == 0:
        return "NULL"

    # 计算前缀和
    prefix = [0] * (n + 1)
    for i in range(n):
        prefix[i + 1] = prefix[i] + arr[i]

    max_len = 0
    results = []

    # 遍历所有子数组
    for i in range(n):
        # 提前终止:如果剩余长度小于当前最大长度,不可能找到更长的
        if n - i <= max_len:
            break
        for j in range(i, n):
            length = j - i + 1
            subarray_sum = prefix[j + 1] - prefix[i]
            average = subarray_sum / length

            if average <= minAvg:
                if length > max_len:
                    # 找到更长的,更新结果
                    max_len = length
                    results = [(i, j)]
                elif length == max_len:
                    # 找到相同长度的,添加到结果
                    results.append((i, j))

    if max_len == 0:
        return "NULL"

    # 按起始下标排序并格式化输出
    results.sort()
    return " ".join([f"{start}-{end}" for start, end in results])

if __name__ == '__main__':
    minAvg = int(input())
    arr = list(map(int,input().split()))
    print(find_max_length_subarrays(minAvg, arr))

查找接口成功率最优时间段
作者
Shisuiyi
发表于
2025-12-06
License
CC BY-NC-SA 4.0

评论