问题描述
小明正在设计一台打点计数器,该计数器可以接受多个递增的数字范围,并对这些范围内的每个唯一数字打点。如果多个范围之间有重叠,计数器将合并这些范围并只对每个唯一数字打一次点。小明需要你帮助他计算,在给定的多组数字范围内,计数器会打多少个点。
例如,给定三个数字范围 [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 )