【2024字节青训·易】打点计时器

问题描述

小明想发明一台打点计数器,这个计数器有这样的一个功能:

  • 它可以接收一个递增的数据范围(形如[3, 9]),其中第一个数字代表起始,第二个数字代表结束

  • 这个数据范围中包含几个数字,打点计数器就会打几个点

  • 在传入的多组数据范围中,如果出现了范围的重复,机器则不会重复打点

你可以帮助小明算一算,在不同的情况下,计数器会打出几个点么?

输入格式

一个二维数组

输出格式

一个整数,表达在输入是这个数组的情况下,计数器打出的点数

输入样例(1)

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

输出样例(1)

7

输入样例(2)

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

输出样例(2)

9

数据范围

  • 数字范围 [-10^9, 10^9],数组长度 < 2^16

题解

  • 排序:首先对区间按起始值进行排序,确保我们能顺序处理区间。
  • 合并:遍历排序后的区间列表,合并重叠的区间,确保没有重复计数。
  • 计算长度:合并后的区间长度之和即为所需的结果。
def solution(inputArray):
    if not inputArray:
        return 0
    
    # 按开始值排序
    inputArray.sort()
    
    # 合并重复的区间
    merged_ranges = []
    current_start, current_end = inputArray[0]
    
    for start, end in inputArray[1:]:
        if start <= current_end:
            # 如果重合了就合并
            current_end = max(current_end, end)
        else:
            # 没有重合就当他是新的开始
            merged_ranges.append((current_start, current_end))
            current_start, current_end = start, end
    
    # 加上最后一段
    merged_ranges.append((current_start, current_end))
    # print(merged_ranges)
    # 计算总共需要打点的长度,注意样例其实是开始位置打点,结尾不大点
    total_points = sum(end - start +1  for start, end in merged_ranges)
    print(total_points)
    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) == 11 )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值