打点计数器的区间合并 | 豆包MarsCode AI刷题

102 阅读3分钟

原题如下:

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

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

这是一道关于区间合并与计数的问题,小明需要设计一个打点计数器,该计数器能够处理多个递增的数字范围,并对这些范围内的每个唯一数字进行打点。如果多个范围之间存在重叠,计数器需要合并这些范围,并确保每个唯一数字只被打点一次。为了解决这个问题,我们可以将解题思路细化为以下几个步骤:

一、理解问题

首先,我们需要明确问题的输入和输出。输入是多个递增的数字范围(区间),输出是计数器需要打点的唯一数字的数量。

二、合并区间

由于可能存在多个重叠的区间,我们需要首先将这些区间合并成一个或多个没有重叠的区间。合并区间的步骤如下:

  1. 排序:将所有区间的起点和终点分别提取出来,并进行排序。这样,我们可以按照顺序处理这些区间。

  2. 遍历:从第一个区间开始,依次遍历每个区间。对于当前遍历到的区间,我们检查它是否与上一个已合并的区间存在重叠。

    • 如果存在重叠,我们将当前区间与上一个已合并的区间进行合并,形成一个新的、更大的区间。
    • 如果不存在重叠,我们将当前区间作为一个新的已合并区间。
  3. 记录:在遍历过程中,我们需要记录所有已合并的区间。

三、计算唯一数字的数量

合并区间后,我们得到了一个或多个没有重叠的区间。接下来,我们需要计算这些区间内包含的唯一数字的数量。

  1. 遍历区间:依次遍历每个已合并的区间。
  2. 计数:对于每个区间,我们可以通过计算区间的长度(终点减去起点加1)来得到该区间内包含的唯一数字的数量。
  3. 累加:将所有区间的唯一数字数量进行累加,得到最终需要打点的唯一数字的总数。

代码如下: `

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. 排序:通过排序,我们可以确保区间是按起始值从小到大排列的,这样在合并时可以更方便地处理重叠区间。
  2. 合并区间:我们遍历每个区间,如果当前区间的起始值大于最后一个合并区间的结束值,则直接将当前区间加入合并后的区间列表;否则,合并当前区间到最后的合并区间中。
  3. 计算唯一数字的数量:合并后的区间可以直接计算出包含的唯一数字的数量,即每个区间的结束值减去起始值再加1。