Python-66:打点计数器区间合并

问题描述

小明正在设计一台打点计数器,该计数器可以接受多个递增的数字范围,并对这些范围内的每个唯一数字打点。如果多个范围之间有重叠,计数器将合并这些范围并只对每个唯一数字打一次点。小明需要你帮助他计算,在给定的多组数字范围内,计数器会打多少个点。

例如,给定三个数字范围 [1, 4], [7, 10], 和 [3, 5],计数器首先将这些范围合并,变成 [1, 5] 和 [7, 10],然后计算这两个范围内共有多少个唯一数字,即从 1 到 5 有 5 个数字,从 7 到 10 有 4 个数字,共打 9 个点。

代码

def solution(inputArray):

    # Please write your code here

     # 1. 按照起始点排序

    inputArray.sort(key=lambda x: x[0])

   

    # 2. 初始化合并后的范围列表

    merged_ranges = []

   

    # 3. 遍历排序后的范围列表

    for start, end in inputArray:

        if not merged_ranges or merged_ranges[-1][1] < start:

            # 如果没有重叠,直接添加到合并后的范围列表

            merged_ranges.append([start, end])

        else:

            # 如果有重叠,合并到上一个范围

            merged_ranges[-1][1] = max(merged_ranges[-1][1], end)

   

    # 4. 计算合并后的范围的总长度

    total_points = 0

    for start, end in merged_ranges:

        total_points += (end - start + 1)

   

    print(merged_ranges)

    return total_points

if __name__ == "__main__":

    #  You can add more test cases here

    testArray1 = [[1,4], [7, 10], [3, 5]]

    testArray2 = [[1,2], [6, 10], [11, 15]]

    print(solution(testArray1) == 9 )

    print(solution(testArray2) == 12 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

完成大叔

你的鼓励是创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值