57. Insert Interval【H】【67】

本文介绍了一个算法问题:如何在一个已排序的不重叠区间列表中插入一个新的区间,并在必要时进行合并。通过两个实例详细解释了该算法的工作原理及实现方式,包括使用lambda表达式进行排序的方法。

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].


Subscribe to see which companies asked this question



注释掉的是调用前面一道题的解法的

后面的是看见人家的一个解法的。一个是用lambda演算,一个是直接对最后一个元素进行处理
# Definition for an interval.
# class Interval(object):
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution(object):
    def insert(self, intervals, newInterval):

        l = intervals

        l += newInterval,

        li = sorted(l,key = lambda i:i.start)

        #print li

        res = []
        for i in li:
            if res and i.start <= res[-1].end :
                res[-1].end = max(i.end,res[-1].end)
            else:
                res += i,
        return res

        '''

        l = []
        for i in intervals:
            l += [i.start,i.end],

        l += [newInterval.start,newInterval.end],

        l.sort()
        res = []

        i = 0
        while i < (len(l)):
            s = l[i][0]
            e = l[i][1]

            while i < len(l)-1 and l[i+1][0] <= e:
                e = max(l[i+1][1],e)
                i += 1
            res += Interval(s,e),
            i += 1

        return res
        '''
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """


为什么这个软件在运行了一次之后就无响应?怎么解决?写出完整的修改之后的代码吧:import tkinter as tk from tkinter import messagebox, ttk import requests import os import time import random import logging import json # 配置日志记录 logging.basicConfig(filename='download.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') def save_config(url, folder, min_interval, max_interval): config = { "url": url, "folder": folder, "min_interval": min_interval, "max_interval": max_interval } with open('config.json', 'w') as f: json.dump(config, f) def load_config(): if os.path.exists('config.json'): with open('config.json', 'r') as f: config = json.load(f) return config return {} def download_file(url, save_path, progress_bar, log_text, max_retries=3): retries = 0 while retries < max_retries: try: response = requests.get(url, stream=True) response.raise_for_status() total_size = int(response.headers.get('content-length', 0)) block_size = 1024 wrote = 0 with open(save_path, 'wb') as file: for data in response.iter_content(block_size): wrote = wrote + len(data) file.write(data) if total_size != 0: progress = (wrote / total_size) * 100 progress_bar['value'] = progress log_text.insert(tk.END, f"下载进度: {progress:.2f}%\n") log_text.see(tk.END) logging.info(f"成功下载文件: {url} 到 {save_path}") log_text.insert(tk.END, f"成功下载文件: {url} 到 {save_path}\n") log_text.see(tk.END) return True except requests.RequestException as e: retries += 1 logging.error(f"下载 {url} 失败,第 {retries} 次重试: {e}") log_text.insert(tk.END, f"下载 {url} 失败,第 {retries} 次重试: {e}\n") log_text.see(tk.END) logging.error(f"下载 {url} 失败,达到最大重试次数") log_text.insert(tk.END, f"下载 {url} 失败,达到最大重试次数\n") log_text.see(tk.END) return False def start_download(url_entry, folder_entry, min_interval_entry, max_interval_entry, progress_bar, log_text): url = url_entry.get() folder = folder_entry.get() min_interval = int(min_interval_entry.get()) max_interval = int(max_interval_entry.get()) save_config(url, folder, min_interval, max_interval) if not os.path.exists(folder): os.makedirs(folder) while True: file_name = url.split("/")[-1] save_path = os.path.join(folder, file_name) if download_file(url, save_path, progress_bar, log_text): messagebox.showinfo("下载成功", f"文件 {file_name} 下载成功!") else: messagebox.showerror("下载失败", f"文件 {file_name} 下载失败!") interval = random.randint(min_interval, max_interval) logging.info(f"下次下载将在 {interval} 秒后进行") log_text.insert(tk.END, f"下次下载将在 {interval} 秒后进行\n") log_text.see(tk.END) time.sleep(interval) # 创建主窗口 root = tk.Tk() root.title("定时文件下载器") # URL 输入框 url_label = tk.Label(root, text="文件 URL:") url_label.pack() url_entry = tk.Entry(root, width=50) url_entry.pack() # 保存文件夹输入框 folder_label = tk.Label(root, text="保存文件夹:") folder_label.pack() folder_entry = tk.Entry(root, width=50) folder_entry.pack() # 最小间隔输入框 min_interval_label = tk.Label(root, text="最小下载间隔 (秒):") min_interval_label.pack() min_interval_entry = tk.Entry(root, width=10) min_interval_entry.pack() # 最大间隔输入框 max_interval_label = tk.Label(root, text="最大下载间隔 (秒):") max_interval_label.pack() max_interval_entry = tk.Entry(root, width=10) max_interval_entry.pack() # 进度条 progress_bar = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate") progress_bar.pack() # 日志文本框 log_text = tk.Text(root, height=10, width=50) log_text.pack() # 开始下载按钮 start_button = tk.Button(root, text="开始下载", command=lambda: start_download(url_entry, folder_entry, min_interval_entry, max_interval_entry, progress_bar, log_text)) start_button.pack() # 加载配置 config = load_config() if config: url_entry.insert(0, config.get("url", "")) folder_entry.insert(0, config.get("folder", "")) min_interval_entry.insert(0, config.get("min_interval", "")) max_interval_entry.insert(0, config.get("max_interval", "")) # 运行主循环 root.mainloop()
09-19
将如下SQL改写成PROCEDURE DECLARE TYPE t_param_values IS TABLE OF VARCHAR2(4000); v_params t_param_values; v_exists NUMBER; v_found BOOLEAN := FALSE; -- 修复点:声明匹配标志变量 BEGIN -- 预加载参数值(减少循环中重复查询) SELECT REGEXP_REPLACE(VALUE1, '[^[:alnum:] ]', '') BULK COLLECT INTO v_params FROM LPBD7.U_PARAMETER_FILE WHERE CONDITION1 = 'ORT_EBORD' AND ACTIVE = 'Y' GROUP BY REGEXP_REPLACE(VALUE1, '[^[:alnum:] ]', ''); -- 直接去重 FOR rec IN ( SELECT H.EVENT, H.AGENT_ID, H.SERIALS_BAND, H.SERIALS_SP, H.SERIALS_BG, H.SERIALS_FG, H.JSON, JSON_VALUE(H.JSON, '$.insight.results.test') TEST_NAME, H.CREATED, H.INSERTD, H.STATION_ID, H.ID, JSON_VALUE(H.JSON, '$.insight.uut_attributes.sample_type') SAMPLE_TYPE, -- 预计算正则处理值(提升性能) UPPER(REGEXP_REPLACE(JSON_VALUE(H.JSON, '$.insight.results.test'), '[^[:alnum:] ]', '')) CLEAN_TEST FROM LPBD7.AGENCY_LOGS_JSON H JOIN MESNEX.AGENCY_JOBS J ON H.AGENT_ID = J.AGENT JOIN MESNEX.AGENCY_PROCESS P ON J.PROCESS = P.ID WHERE UPPER(P.NAME) = 'ORT-RAW' AND J.DISABLED = 'False' AND H.CREATED BETWEEN J.STARTED AND J.ENDED AND H.CREATED >= TRUNC(SYSDATE) + 8.5/24 ) LOOP -- 重置匹配标志 v_found := FALSE; -- 参数匹配检查(使用预加载集合) FOR i IN 1..v_params.COUNT LOOP CONTINUE WHEN v_params(i) IS NULL; IF INSTR(rec.CLEAN_TEST, UPPER(v_params(i))) > 0 THEN v_found := TRUE; EXIT; -- 找到匹配立即退出 END IF; END LOOP; IF v_found THEN -- 修复点:使用显式声明的标志变量 -- 检查目标表是否存在重复记录 SELECT COUNT(1) INTO v_exists FROM LPBD7.AGENCY_LOGS_ORT WHERE EVENT = rec.EVENT AND AGENT_ID = rec.AGENT_ID AND SERIALS_BAND = rec.SERIALS_BAND AND SERIALS_SP = rec.SERIALS_SP AND SERIALS_BG = rec.SERIALS_BG AND SERIALS_FG = rec.SERIALS_FG AND TEST_NAME = rec.TEST_NAME AND CREATED = rec.CREATED AND INSERTD = rec.INSERTD AND STATION_ID = rec.STATION_ID; IF v_exists = 0 THEN INSERT INTO LPBD7.AGENCY_LOGS_ORT ( EVENT, AGENT_ID, SERIALS_BAND, SERIALS_SP, SERIALS_BG, SERIALS_FG, TEST_NAME, CREATED, INSERTD, STATION_ID, ID ) VALUES ( rec.EVENT, rec.AGENT_ID, rec.SERIALS_BAND, rec.SERIALS_SP, rec.SERIALS_BG, rec.SERIALS_FG, rec.TEST_NAME, rec.CREATED, rec.INSERTD, rec.STATION_ID, rec.ID ); -- 调用存储过程(确保事务一致性) LPBD7.SP_LOG_ORT_INSERT_EVENT( rec.SERIALS_BAND, rec.SERIALS_SP, rec.SERIALS_BG, rec.SERIALS_FG, rec.ID, rec.CREATED, rec.TEST_NAME, rec.EVENT, rec.JSON, rec.SAMPLE_TYPE ); END IF; END IF; END LOOP; COMMIT; -- 统一提交(减少I/O开销) EXCEPTION -- 新增异常处理 WHEN OTHERS THEN ROLLBACK; RAISE; END; /
09-19
现有如下oracle的PROCEDURE,LPBD7.AGENCY_LOGS_JSON数据量庞大超百万,请改写获取上次处理位置和获取新处理的最后ID, 同时请协助优化成逻辑简单清晰,提高执行效率和减少资源占用: CREATE OR REPLACE PROCEDURE LPBD7.SP_INSERT_AGENCY_LOGS_ORT AS v_params SYS.ODCIVARCHAR2LIST; v_last_id AGENCY_LOGS_JSON.ID%TYPE; v_new_last_id AGENCY_LOGS_JSON.ID%TYPE; v_msg VARCHAR2(4000); v_result VARCHAR2(500); v_max_datetime DATE; v_pattern VARCHAR2(4000); -- 正则表达式模式 -- 获取ID列的默认值 FUNCTION get_default_id_value RETURN AGENCY_LOGS_JSON.ID%TYPE IS BEGIN RETURN 0; -- 统一返回数字0 EXCEPTION WHEN OTHERS THEN RETURN 0; END; BEGIN -- 获取上次处理位置 BEGIN SELECT last_id INTO v_last_id FROM LPBD7.PROC_SYNC_STATUS WHERE proc_name = 'SP_INSERT_AGENCY_LOGS_ORT'; EXCEPTION WHEN NO_DATA_FOUND THEN v_last_id := get_default_id_value(); END; -- 初始化v_new_last_id v_new_last_id := v_last_id; -- 预加载参数值并构建正则表达式 SELECT REGEXP_REPLACE(VALUE1, '[^[:alnum:] ]', '') BULK COLLECT INTO v_params FROM LPBD7.U_PARAMETER_FILE WHERE CONDITION1 = 'ORT_EBORD' AND ACTIVE = 'Y' GROUP BY REGEXP_REPLACE(VALUE1, '[^[:alnum:] ]', ''); -- 构建正则表达式模式 FOR i IN 1..v_params.COUNT LOOP IF v_params(i) IS NOT NULL THEN IF v_pattern IS NULL THEN v_pattern := v_params(i); ELSE v_pattern := v_pattern || '|' || v_params(i); END IF; END IF; END LOOP; -- 安全的日期处理 BEGIN SELECT MAX(LAST_DATETIME) INTO v_max_datetime FROM LP960.TC_AGENCY_JOB_LOG WHERE EXECUTETIME > SYSDATE - 0.5 AND JOBNAME = 'AgencyAPI_Lobs_Json'; EXCEPTION WHEN NO_DATA_FOUND THEN v_max_datetime := TRUNC(SYSDATE) + CASE WHEN SYSDATE - TRUNC(SYSDATE) < 8.5/24 THEN -1 + 20.5/24 WHEN SYSDATE - TRUNC(SYSDATE) < 20.5/24 THEN 8.5/24 ELSE 20.5/24 END; END; -- 批量插入处理(单条SQL实现) INSERT INTO LPBD7.AGENCY_LOGS_ORT ( EVENT, AGENT_ID, SERIALS_BAND, SERIALS_SP, SERIALS_BG, SERIALS_FG, TEST_NAME, CREATED, INSERTD, STATION_ID, ID ) SELECT h.EVENT, h.AGENT_ID, h.SERIALS_BAND, h.SERIALS_SP, h.SERIALS_BG, h.SERIALS_FG, JSON_VALUE(h.JSON, '$.insight.results.test'), h.CREATED, h.INSERTD, h.STATION_ID, h.ID FROM LPBD7.AGENCY_LOGS_JSON h JOIN MESNEX.AGENCY_JOBS j ON h.AGENT_ID = j.AGENT JOIN MESNEX.AGENCY_PROCESS p ON j.PROCESS = p.ID WHERE UPPER(p.NAME) = 'ORT-RAW' AND j.DISABLED = 'False' AND h.CREATED BETWEEN j.STARTED AND j.ENDED AND h.ID > v_last_id AND h.CREATED >= NVL(v_max_datetime, SYSDATE - 30) - INTERVAL '10' MINUTE AND v_pattern IS NOT NULL -- 确保有参数才处理 AND REGEXP_LIKE( UPPER(REGEXP_REPLACE(JSON_VALUE(h.JSON, '$.insight.results.test'), '[^[:alnum:] ]', '')), v_pattern ) AND NOT EXISTS ( SELECT 1 FROM LPBD7.AGENCY_LOGS_ORT o WHERE o.ID = h.ID AND o.TEST_NAME = JSON_VALUE(h.JSON, '$.insight.results.test') ) ORDER BY h.ID; -- 获取新处理的最后ID BEGIN SELECT MAX(ID) INTO v_new_last_id FROM LPBD7.AGENCY_LOGS_JSON WHERE ID > v_last_id AND CREATED >= NVL(v_max_datetime, SYSDATE - 30) - INTERVAL '10' MINUTE; EXCEPTION WHEN NO_DATA_FOUND THEN v_new_last_id := v_last_id; END; -- 批量调用存储过程(使用游标) FOR rec IN ( SELECT h.SERIALS_BAND, h.SERIALS_SP, h.SERIALS_BG, h.SERIALS_FG, h.ID, h.CREATED, JSON_VALUE(h.JSON, '$.insight.results.test') AS test_name, h.EVENT, h.JSON, JSON_VALUE(h.JSON, '$.insight.uut_attributes.sample_type') AS sample_type FROM LPBD7.AGENCY_LOGS_JSON h WHERE h.ID > v_last_id AND h.ID <= v_new_last_id ) LOOP LPBD7.SP_LOG_ORT_INSERT_EVENT( rec.SERIALS_BAND, rec.SERIALS_SP, rec.SERIALS_BG, rec.SERIALS_FG, rec.ID, rec.CREATED, rec.test_name, rec.EVENT, rec.JSON, rec.sample_type ); END LOOP; -- 更新处理位置 MERGE INTO LPBD7.PROC_SYNC_STATUS dst USING (SELECT 'SP_INSERT_AGENCY_LOGS_ORT' proc_name FROM DUAL) src ON (dst.proc_name = src.proc_name) WHEN MATCHED THEN UPDATE SET last_id = v_new_last_id WHEN NOT MATCHED THEN INSERT (proc_name, last_id) VALUES (src.proc_name, v_new_last_id); COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; v_msg := SQLERRM; SELECT SAJET.SF_MES_Send_Mail( 'mes.it@tzlens.com,yujia.liu@tzlens.com', 'SP_INSERT_AGENCY_LOGS_ORT ERROR: ' || SUBSTR(v_msg, 1, 4000), 'STORED PROCEDURE ERROR', '', '', '' ) INTO v_result FROM DUAL; RAISE; END;
09-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值