问题描述
小明想发明一台打点计数器,这个计数器有这样的一个功能:
-
它可以接收一个递增的数据范围(形如[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 )

432

被折叠的 条评论
为什么被折叠?



