【华为OD】C卷真题:100%通过 查找接口成功率最优时间段 python代码实现[思路+代码]

 

 

 

题目描述:

 

服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数,给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值,即平均失败率小于等于minAverageLost,找出数组中最长时间段,如果未找到则直接返回NULL。

输入描述

输入有两行内容,第一行为{minAverageLost},第二行为{数组},数组元素通过空格(" ")分隔,minAverageLost及数组中元素取值范围为0~100的整数,数组元素的个数不会超过100个。

输出描述

找出平均值小于等于minAverageLost的最长时间段,输出数组下标对,格式{beginIndex}-{endIndx}(下标从0开始),如果同时存在多个最长时间段,则输出多个下标对且下标对之间使用空格(" ")拼接,多个下标对按下标从小到大排序。

示例1

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

输入

1 0 1 2 3 4

输出

0-2

说明

A、输入解释:minAverageLost=1,数组[0, 1, 2, 3, 4]
B、前3个元素的平均值为1,因此数组第一个至第三个数组下标,即0-2

示例2

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

输入

2 0 0 100 2 2 99 0 2

输出

0-1 3-4 6-7

说明

A、输入解释:minAverageLost=2,数组[0, 0, 100, 2, 2, 99, 0, 2]
B、通过计算小于等于2的最长时间段为:数组下标为0-1即[0, 0],数组下标为3-4即[2, 2],数组下标为6-7即[0, 2],这三个部分都满足平均值小于等2的要求,因此输出0-1 3-4 6-7

 

     668                                                         
                                                            
              +---+                                                          
  3            |   |       ++                               +       +---|   
  |           |   | 3      +                6               +  |   +   |        +
  |      +     |   |       +         +                      +    |  +   |       +
  |      +    |   +---+    +        +        +++++          +   |  +   |        +
  |      +    | +      |   +   +----+        |   |          +   |  +   |        +
  |      +  3 | +      |   +   +    +      2 |   |     2    +   |  +   |        +
  |      +    | +      |   +   +    +        |   |          +   |  +   |        +
  |      +---+ |     |    |  |    +    ----+   |   +---+    |  |  +   |         +
  |      |     |     |    |  |    +    |       |   |   |    |  |  +   |         +
  |    1 |     |     | 8  |  |    +  1 |   |    | 1 |   | 1 |   |  +   |        +
  |      |     |     |    |  |    +    |   |    |   |   |   |   |  +   |        +
  |  +---+     |     +---+   |    ++---+    ++   +---+   +---+   |  +   |        +
  |  |         |         |   |    |         ++              |   |  |+   |        +
  |0 |         |         | 0 |  0 |         ++              | 0 |  |+   |        +
  |  |         |         |   |    |         ++              |   |  |+   |        +
  +---+         +          +-------+                       +---+| +|+   |        +
                +                                                    +   |        +
    0   1   2   3   4   5   6   7   8   9  10  11  12 + v:    w  u m    u 1 0 2 4
 

题目解析:

        先从左到右进行元素累计求和,产生新数组,然后每次从当前位置开始,从末尾往前算差值再求平均数,看是否满足条件,类似一种贪心算法的操作

 

代码实现:

def main():
    min_average_lost = int(input())
    tmp = [int(i) for i in input().split()]
    arr = []
    res = []
    max_len = 0
    size = 0

    for i in range(len(tmp)):
        if size == 0:
            arr.append(tmp[i])
        else:
            arr.append(tmp[i] + arr[size - 1])
        size += 1

    for i in range(size):
        for j in range(size - 1, i, -1):
            sum = arr[j] if i == 0 else (arr[j] - arr[i - 1])
            if j - i + 1 < max_len:
                break
            elif j - i + 1 > max_len and sum / (j - i + 1) <= min_average_lost:
                max_len = j - i + 1
                res.clear()
                res.append([i, j])
            elif j - i + 1 == max_len and sum / (j - i + 1) <= min_average_lost:
                res.append([i, j])

    for item in res:
        print(f"{item[0]}-{item[1]} ", end="")

    if len(res) == 0:
        print("NULL")


if __name__ == "__main__":
    main()

 【华为OD】C卷真题:100%通过 查找接口成功率最优时间段 python代码实现[思路+代码]_第1张图片

 

你可能感兴趣的:(杂谈,算法,华为od,c语言,javascript,java,python,C++)