原题如下:
小明正在设计一台打点计数器,该计数器可以接受多个递增的数字范围,并对这些范围内的每个唯一数字打点。如果多个范围之间有重叠,计数器将合并这些范围并只对每个唯一数字打一次点。小明需要你帮助他计算,在给定的多组数字范围内,计数器会打多少个点。
例如:给定三个数字范围[1, 4], [7,10] 和[3,5], 计数器首先将这些范围合并,变成[1,5]和[7,10] 然后计算这两个范围内共有多少个唯一数字,即从1到5有5个数字,从7到10有4个数字,共打 9 个点。
这是一道关于区间合并与计数的问题,小明需要设计一个打点计数器,该计数器能够处理多个递增的数字范围,并对这些范围内的每个唯一数字进行打点。如果多个范围之间存在重叠,计数器需要合并这些范围,并确保每个唯一数字只被打点一次。为了解决这个问题,我们可以将解题思路细化为以下几个步骤:
一、理解问题
首先,我们需要明确问题的输入和输出。输入是多个递增的数字范围(区间),输出是计数器需要打点的唯一数字的数量。
二、合并区间
由于可能存在多个重叠的区间,我们需要首先将这些区间合并成一个或多个没有重叠的区间。合并区间的步骤如下:
-
排序:将所有区间的起点和终点分别提取出来,并进行排序。这样,我们可以按照顺序处理这些区间。
-
遍历:从第一个区间开始,依次遍历每个区间。对于当前遍历到的区间,我们检查它是否与上一个已合并的区间存在重叠。
- 如果存在重叠,我们将当前区间与上一个已合并的区间进行合并,形成一个新的、更大的区间。
- 如果不存在重叠,我们将当前区间作为一个新的已合并区间。
-
记录:在遍历过程中,我们需要记录所有已合并的区间。
三、计算唯一数字的数量
合并区间后,我们得到了一个或多个没有重叠的区间。接下来,我们需要计算这些区间内包含的唯一数字的数量。
- 遍历区间:依次遍历每个已合并的区间。
- 计数:对于每个区间,我们可以通过计算区间的长度(终点减去起点加1)来得到该区间内包含的唯一数字的数量。
- 累加:将所有区间的唯一数字数量进行累加,得到最终需要打点的唯一数字的总数。
代码如下: `
def solution(inputArray):
inputArray.sort(key=lambda x: x[0])
merged_intervals = []
for interval in inputArray:
if not merged_intervals or interval[0] > merged_intervals[-1][1]:
merged_intervals.append(interval)
else:
merged_intervals[-1][1] = max(merged_intervals[-1][1], interval[1])
count = 0
for interval in merged_intervals:
count += interval[1] - interval[0] + 1
return count
if __name__ == "__main__":
# 你可以添加更多测试用例
testArray1 = [[1, 4], [7, 10], [3, 5]]
testArray2 = [[1, 2], [6, 10], [11, 15]]
print(solution(testArray1) == 9)
print(solution(testArray2) == 12)
`
关键步骤解释
- 排序:通过排序,我们可以确保区间是按起始值从小到大排列的,这样在合并时可以更方便地处理重叠区间。
- 合并区间:我们遍历每个区间,如果当前区间的起始值大于最后一个合并区间的结束值,则直接将当前区间加入合并后的区间列表;否则,合并当前区间到最后的合并区间中。
- 计算唯一数字的数量:合并后的区间可以直接计算出包含的唯一数字的数量,即每个区间的结束值减去起始值再加1。