区间片段合并,或在指定偏差值范围内合并,类似快慢指针

# -*- coding: utf-8 -*-
"""
@Time    : 2023/1/22  022 下午 19:15
@Author  : Jan
@File    : 区间片段合并.py
"""

""" { 区间片段合并,或在指定偏差值范围内合并,类似双指针中的快慢指针 } """

import pysnooper


# 判断两组片段是否满足合并条件
def judg(a: list, b: list, z=[]) -> list:
    x = b[0] - a[1]
    if b[0] <= a[1] and a[1] <= b[1] or x in z:
        return [[a[0], b[1]]]
    elif a[0] <= b[0] and b[1] <= a[1]:
        return [a]  # 前者包含后者 注意:后面会根据返回长度判断是否已合并,所以必须多加一层 []
    else:
        return [a, b]  # 不满足原样输出


# @pysnooper.snoop()
def combine(li: list, z=[]) -> list:
    li = sorted(li, key=lambda x: x[0])  # 规整列表,排除乱序情况
    i = 1
    res = [li[0]]
    while i < len(li):
        tmp = judg(res[-1], li[i], z)
        if len(tmp) == 1:
            res[-1][1] = tmp[0][-1]
        else:
            res.append(tmp[1])
        i += 1
    return res


def merge(li, z=[]):
    if not li:
        return []
    li.sort(key=lambda x: x[0])
    res = [li[0]]
    for i in li[1:]:
        x = i[0] - res[-1][1]
        if i[0] <= res[-1][1] and res[-1][1] < i[1] or x in z:
            res[-1][1] = i[1]
        elif res[-1][1] < i[0]:
            res.append(i)
        else:
            pass
    return res
  
  
# 输入样例:
# [1, 10], [15, 20], [18, 30], [33, 40]
# [5, 4, 3, 2]
# li = eval("[" + input() + "]")
# z = eval(input())

li = [[1, 10], [15, 20], [18, 30], [33, 40]]
z = [5, 4, 3, 2]  # 指定的偏差值范围

print(combine(li))  # 合并有重叠的区域
print(combine(li, z))  # 拼接间距存在 z 列表值,方法一
print(merge(li, z))  # 拼接间距存在 z 列表值,方法二

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 16:15
我应届生,去年10月份开始在这家公司实习,到今年10月份正好一年想(实习+试用期),在想要不要提前9月份就离职,这样好找工作些,但又差一个月满一年,又怕10月份国庆回来离职,容易错过了下半年的金九银十,到年底容易gap到年后
小破站_程序员YT:说这家公司不好吧,你干了快一年 说这家公司好吧,你刚毕业就想跑路说你不懂行情吧,你怕错过金九银十说 你懂行情吧,校招阶段在实习,毕业社招想换工作 哥们,我该怎么劝你留下来呢
应届生,你找到工作了吗
点赞 评论 收藏
分享
07-10 12:17
已编辑
商丘师范学院 Java
后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
无实习如何秋招上岸
点赞 评论 收藏
分享
认真搞学习:这么良心的老板真少见
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务