整数数组区间的插入与删除
相似题参考:
56. Merge Intervals - 力扣(LeetCode)合并区间
57. 插入区间 - 力扣(LeetCode)
1272. 删除区间
package Jerry;import org.junit.Assert;
import org.junit.Test;import java.util.ArrayList;
import java.util.List;// Task: Implement a class named 'RangeList'
// A pair of integers define a range, for example: [1, 5). This range includes integers: 1, 2, 3, and 4.
// A range list is an aggregate of these ranges: [1, 5), [10, 11), [100, 201)public class RangeList {// 结果private List<int[]> intervals = new ArrayList<>();// toString 使用的静态常量private static final String LEFT = "[";private static final String RIGHT = ")";private static final String FLAG = ", ";private static final String BLANK = " ";/*** junit单元测试*/@Testpublic void test() {RangeList rl = new RangeList();System.out.println(rl.toString()); // Should be ""Assert.assertEquals(rl.toString(), "");rl.add(1, 5);//rl.add(new int[]{1, 5});System.out.println(rl.toString()); // Should be: "[1, 5)"Assert.assertEquals(rl.toString(), "[1, 5)");rl.add(10, 20);System.out.println(rl.toString()); // Should be: "[1, 5) [10, 20)"Assert.assertEquals(rl.toString(), "[1, 5) [10, 20)");rl.add(20, 20);System.out.println(rl.toString()); // Should be: "[1, 5) [10, 20)"Assert.assertEquals(rl.toString(), "[1, 5) [10, 20)");rl.add(20, 21);System.out.println(rl.toString()); // Should be: "[1, 5) [10, 21)"Assert.assertEquals(rl.toString(), "[1, 5) [10, 21)");rl.add(2, 4);System.out.println(rl.toString()); // Should be: "[1, 5) [10, 21)"Assert.assertEquals(rl.toString(), "[1, 5) [10, 21)");rl.add(3, 8);System.out.println(rl.toString()); // Should be: "[1, 8) [10, 21)"Assert.assertEquals(rl.toString(), "[1, 8) [10, 21)");rl.remove(10, 10);System.out.println(rl.toString()); // Should be: "[1, 8) [10, 21)"Assert.assertEquals(rl.toString(), "[1, 8) [10, 21)");rl.remove(10, 11);System.out.println(rl.toString()); // Should be: "[1, 8) [11, 21)"Assert.assertEquals(rl.toString(), "[1, 8) [11, 21)");rl.remove(15, 17);System.out.println(rl.toString()); // Should be: "[1, 8) [11, 15) [17, 21)"Assert.assertEquals(rl.toString(), "[1, 8) [11, 15) [17, 21)");rl.remove(3, 19);System.out.println(rl.toString()); // Should be: "[1, 3) [19, 21)"Assert.assertEquals(rl.toString(), "[1, 3) [19, 21)");// 新增移除区间不存在的情况rl.remove(4, 18);System.out.println(rl.toString()); // Should be: "[1, 3) [19, 21)"Assert.assertEquals(rl.toString(), "[1, 3) [19, 21)");// 新增添加区间覆盖所有分区的情况rl.add(1, 21);System.out.println(rl.toString()); // Should be: "[1, 21)"Assert.assertEquals(rl.toString(), "[1, 21)");// 新增移除区间覆盖所有分区的情况rl.remove(1, 21);System.out.println(rl.toString()); // Should be: ""Assert.assertEquals(rl.toString(), "");}void add(int start, int end) {add(new int[]{start, end});}/*** 新增一个区间到区间列表中** @param range - 整数数组*/void add(int[] range) {// 参数检查if (!checkParams(range)) {return;}// 原来的区间为空if (intervals.isEmpty()) {intervals.add(range);}// 存储新增&合并后的结果ArrayList<int[]> res = new ArrayList<>();// 记录res是否已经add输入的区间boolean hadInsert = false;for (int[] item : intervals) {// 1 不相交,后续元素存在相交可能性// 新增区间 = [10,12)// 遍历节点item = [6,8)if (item[1] < range[0]) {res.add(item);continue;}// 2 不相交,当前遍历节点start比输入的end大,在当前节点item前插入新节点,然后中止插入流程// 新增区间 = [1,3)// 遍历节点item = [6,8)if (item[0] > range[1]) {if (!hadInsert) {res.add(range);hadInsert = true;}res.add(item);continue;}// 3 以下是相交的情况// 3.1 新增区间完全包含覆盖遍历的节点item区间,丢弃或移除遍历节点// 新增区间 = [5,10)// 遍历节点item = [6,8)if (item[0] > range[0] && item[1] < range[1]) {continue;}// 3.2 新增区间前半部分与遍历的节点item相交,扩展新增区间start的范围至item[0]// 新增区间(原来) = [5,10)// 遍历节点item = [4, 6)// 新增区间(更新后) = [4,10)if (item[0] < range[0]) {range[0] = item[0];}// 3.3 新增区间后半部分与遍历的节点item相交,扩充新增区间end的范围至item[1]// 新增区间(原来) = [5,10)// 遍历节点item = [8, 12)// 新增区间(更新后) = [5,12)if (item[1] > range[1]) {range[1] = item[1];}}// 4 边界处理,可能需要把新增区间插入到结果列表中int[] last = res.size() == 0 ? range : res.get(res.size() - 1);if (res.size() == 0 || last[1] < range[0]) {res.add(range);}intervals = res;}void remove(int start, int end) {remove(new int[]{start, end});}/*** 从区间列表中移除一个区间** @param range 移除区间*/void remove(int[] range) {// 参数检查if (!checkParams(range)) {return;}// 原来的区间为空if (intervals.isEmpty()) {return;}// 存储新增&合并后的结果ArrayList<int[]> res = new ArrayList<>();for (int[] item : intervals) {// 1 不相交,直接加入到结果集中// 移除区间range = [10,12)// 遍历节点item = [6,8) 或 [14,15)if (range[1] <= item[0] || range[0] >= item[1]) {res.add(item);continue;}// 2 以下是相交的情况// 2.1 完全移除:移除区间range完全包含或覆盖遍历的节点item区间// 移除区间range = [5,10)// 遍历节点item = [6,8)if (range[0] <= item[0] && range[1] >= item[1]) {continue;}// 移除部分区间if (range[0] <= item[1]) {if (range[1] >= item[1]) {// 2.2 移除后部分:移除区间range前部与遍历的节点item后部相交,缩短遍历节点item的end范围至range[0]// 移除区间range = [5,10)// 遍历节点item = [4,6)// 遍历节点item(更新后) = [4,5)item[1] = range[0];res.add(item);} else {// 2.3 移除中间部分:原来区间拆分成[item[0], range[0])与[range[1], item[1]) 2部分// 移除区间range = [5,10)// 遍历节点item = [4,10)// 遍历节点item(更新后) = [7,8)// 遍历节点拆分成2部分 = [4,7) [8,10)if (range[0] > item[0]) {res.add(new int[]{item[0], range[0]});}res.add(new int[]{range[1], item[1]});}continue;}// 2.4 移除前部分:移除区间range后部分与遍历的节点item前部相交,缩短遍历节点start范围至range[1]// 移除区间range = [5,10)// 遍历节点item = [8,12)// 遍历节点item(更新后)= [10,12)if (range[1] > item[0]) {item[0] = range[1];res.add(item);}}intervals = res;}/*** 把区间列表转换成字符串** @return string*/@Overridepublic String toString() {StringBuilder builder = new StringBuilder();if (intervals.isEmpty()) {return builder.toString();}for (int i = 0; i < intervals.size(); i++) {int[] item = intervals.get(i);// 非第1个元素前面需要加1个空格if (i >= 1) {builder.append(BLANK);}builder.append(LEFT).append(item[0]).append(FLAG).append(item[1]).append(RIGHT);}return builder.toString();}/*** 参数校验** @param range 数组区间* @return boolean true=校验通过,false=校验不通过*/private boolean checkParams(int[] range) {// 参数及长度核验if (range == null || range.length < 2) {return false;}// 参数值核验return range[0] <= range[1];}
}
相关文章:
整数数组区间的插入与删除
相似题参考: 56. Merge Intervals - 力扣(LeetCode)合并区间 57. 插入区间 - 力扣(LeetCode) 1272. 删除区间 package Jerry;import org.junit.Assert; import org.junit.Test;import java.util.ArrayList; import…...
Git标签
Git 中的标签,指的是某个分支某个特定时间点的状态(静态)。通过标签,可以很方便的切换到标记时的状态。 比较有代表性的是人们会使用这个功能来标记发布结点 (v1.0、v1.2等)。 下面是myatis-plus的标签: 1 标签相关命令 命令作用git tag查看标签&…...
BarCodeWiz ActiveX Control Crack
BarCodeWiz ActiveX Control Crack BarcodeWiz ActiveX Control–只需单击按钮即可将所有基本条形码类型添加到Microsoft Office中。在Microsoft Word中,创建单独的条形码、标签页或合并文档。在Microsoft Excel中,选择单元格范围并自动将每个单元格转换…...
mysql高版本(8.0+)group_by报错的处理方法
mysql高版本8.0 group_by报错的处理方法 1. 原因2. 处理方法2.1 临时方法,重启后失效2.2 修改配置my.ini文件 1. 原因 这个错误一般发生在mysql 5.7以及 5.7以上的版本中,其原因是mysql的默认配置中,sql_mode“ONLY_FULL_GROUP_BY” 这个配置严格执行了 ‘SQL92标准…...
Java 下载压缩zip
Java压缩zip /*** 下载压缩包** param instId 实例id* param response 响应* author 梁伟浩* date 2023-08-21*/GetMapping("/downloadZip")ApiOperation(value "下载压缩包")ApiImplicitParam(name "instId", value "实例id", r…...
GTK3实现自定义列表
使用gtk,如果想自己定义列表,思路可以将每个列表项作为一个hbox,整个列表是一个vbox。通过对容器动态的添加删除,实现列表操作,同时添加任何自己所需要的控件。 下面的例子是实现一个显示图片、按钮和进度条的列表,并且进行上移下移,具有添加和删除列表项功能但没有演示…...
Go语言基础之数组
Array(数组) 数组是同一种数据类型元素的集合。 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。 基本语法: // 定义一个长度为3元素类型为int的数组a var a [3]int数组定义: var 数…...
信息安全从业者考试认证大全
证书是IT从业者知识水平能力的一个体现,考证同时也是拓展自身知识的一个方法。近年来,安全行业风生水起,各种认证层出不穷,眼花缭乱。这里不对任何一个证书做评价,只是做出介绍,在国内,对任何事…...
详解react 15~18新增特性
React 15.x 版本的新增特性: 创建组件类:在 React 15 中,可以使用 createClass 方法来创建组件类。这个方法允许你定义组件的生命周期方法、渲染函数以及其他功能。 PropTypes:React 15 引入了 PropTypes,它是一种用于…...
SpringBoot整合FFmpeg进行视频分片上传(Linux)
SpringBoot整合FFmpeg进行视频分片上传(Linux) 上传的核心思路: 1.将文件按一定的分割规则(静态或动态设定,如手动设置20M为一个分片),用slice分割成多个数据块。 2.为每个文件生成一个唯一标识…...
eNSP综合小实验:VRRP、MSTP、Eth-Trunk、NAT、DHCP等技术应用
完成下图要求: 拓扑图: 配置命令: 由于交换机日志太多不便于复制,所以就复制命令。大概步骤如下: 第一步先分配IP地址,在sw1和sw2上创建VLAN100用于e0/0/3口配IP,在sw1、sw2、sw3、sw4上创建VL…...
正中优配:尾盘拉升的股票第二天的走势?
尾盘拉升是指买卖日快结束时股票价格呈现上涨的状况。关于许多投资者来说,这一般是好事情,因为它可认为他们带来更高的收益。但是,人们常常会问尾盘拉升的股票第二天的走势怎么。本文将从多个角度进行剖析。 首要,咱们需求认识到这…...
ios小组件报错:Please adopt containerBackground API
iOS 17 小组件报错:Please adopt containerBackground API 使用下面的方法解决了: 代码: extension View {func widgetBackground(_ backgroundView: some View) -> some View {if #available(iOSApplicationExtension 17.0, *) {return containerBackground(for: .wi…...
基于AWS的3D模型搜索服务实现
3D模型广泛应用于计算机游戏、电影、工程、零售业、广告等许多领域。市场上有很多制作3D模型的工具,但几乎没有工具可以直观地搜索3D模型数据库以找到类似的3D模型 因为开发好的 3D 模型搜索工具非常具有挑战性。 它需要复杂的计算和 AI/ML 框架来创建模型描述符并提…...
pycharm远程连接docker容器
pycharm远程连接docker容器 1.根据镜像创建容器2.进入容器3.修改容器的root密码4. 容器安装openssh-server和openssh-client5.修改SSH配置文件6.重启ssh服务7. 退出测试8.配置pycharm并连接docker容器9. 选择docker环境 1.根据镜像创建容器 sudo docker run -itd --nameconn_t…...
开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)
Cesium学习 2023.8.21 1、Cesium简介1.1 Github上的Cesium 2、Cesium下载安装使用2.1 方式一:页面在线引用2.2 方式二:页面离线使用2.3 方式三:完整项目使用 3、CesiumJS学习教程(快速上手 API文档)3、Cesium官方示例…...
RT-Thread学习日记——点亮LED
最近开始接触RT-Thread,后面会单独建立专栏以此记录我的学习过程,如果能给你的学习提供参考,本人倍感荣幸。 学习工具:正点原子战舰开发板 一、、点亮LED 在RT-Thread的配置项里搜索LED可以看到和LED相关的很多内容,…...
粘包问题(TCP面向字节流批量发送数据导致)
粘包问题出现的原因 由于TCP协议网络传输数据的基本单位是字节流,所以当应用程序收到了传输的数据时,看到的是一连串的字节数据,而TCP协议网络传输数据有滑动窗口的机制(核心就是批量传输数据,推荐看TCP中窗口和滑动窗…...
selenium Chrome驱动下载地址
Chrome驱动官方最新版下载地址:https://googlechromelabs.github.io/chrome-for-testing/ 有稳定版,开发版等版本可以选择下载 选择 操作系统复制下载链接直接下载...
Linux命令200例:tar命令主要用于创建、查看和提取归档文件(常用)
🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…...
【Django】Task4 序列化及其高级使用、ModelViewSet
【Django】Task4 序列化及其高级使用、ModelViewSet Task4主要了解序列化及掌握其高级使用,了解ModelViewSet的作用,ModelViewSet 是 Django REST framework(DRF)中的一个视图集类,用于快速创建处理模型数据的 API 视…...
FFMPEG RTMP流打开速度慢优化方法一
先上使用方法: codec_ctx->flags | AVFMT_FLAG_NOBUFFER; AVFMT_FLAG_NOBUFFER 标记如果没有设置,就会导致打开时探测的数据包丢AVFormatContext的缓存区中。 播放的时候,就从这些数据包开始,但是整个探测过程时间可能较长&…...
NextJs - Middleware(中间件)
中间件允许您在请求完成之前运行代码。然后,根据传入的请求,您可以通过重写、重定向、修改请求或响应标头或直接响应来修改响应。 中间件在缓存内容和路由匹配之前运行。 使用规则 使用项目根目录中的文件 middleware.ts(或 .js)…...
记录几个Hudi Flink使用问题及解决方法
前言 如题,记录几个Hudi Flink使用问题,学习和使用Hudi Flink有一段时间,虽然目前用的还不够深入,但是目前也遇到了几个问题,现在将遇到的这几个问题以及解决方式记录一下 版本 Flink 1.15.4Hudi 0.13.0 流写 流写…...
Go:测试框架GoConvey 简介
快速开始 GoConvey是一个完全兼容官方Go Test的测试框架,一般来说这种第三方库都比官方的功能要强大、更加易于使用、开发效率更高,闲话少说,先看一个example: package utils import (. "github.com/smartystreets/goconvey…...
JavaWeb-特殊文件(propertis与XML)
目录 Properties文件 一.properties介绍 二.properties使用 三.解决中文乱码问题 XML文件 一.XML介绍 二.XML文件的语法规则 三.XML的使用 Properties文件 一.properties介绍 1.什么是properties文件 Properties文件是一种常用的配置文件格式,用于存储键值…...
ffmpeg合并mp4视频文件
下载ffmpeg Download FFmpeg 2配置环境 右键此电脑-》属性-》高级系统设置 环境变量-》path 解压上面ffmpeg压缩包,找到bin目录,复制完整路径,添加到path环境变量中 测试ffmpeg ffmpeg合并MP4文件 创建一个文本文件,例如inpu…...
ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析
ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析 1 ATF的下载链接2 ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks处理流程2.1 ATF BL1/BL2 ufs_read_blocks2.2 ATF BL1/BL2 ufs_write_blocks 3 UFS System Model4 ufs_read_blocks/ufs_write_blocks详细分析4.1 ufs_re…...
Elasticsearch(十二)搜索---搜索匹配功能③--布尔查询及filter查询原理
一、前言 本节主要学习ES匹配查询中的布尔查询以及布尔查询中比较特殊的filter查询及其原理。 复合搜索,顾名思义是一种在一个搜索语句中包含一种或多种搜索子句的搜索。 布尔查询是常用的复合查询,它把多个子查询组合成一个布尔表达式,这些…...
解决Windows下的docker desktop无法启动问题
以管理员权限运行cmd 报错: docker: error during connect: Post http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.40/containers/create: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows,…...
LLM生成式 AI 项目生命周期Generative AI project lifecycle
在本课程的其余部分中,您将学习开发和部署LLM驱动应用所需的技巧。在这个视频中,您将了解一个能帮助您完成此工作的生成式AI项目生命周期。此框架列出了从构思到启动项目所需的任务。到课程结束时,您应该对您需要做的重要决策、可能遇到的困难…...
java高并发系列 - 第13天:JUC中的Condition对象
java高并发系列 - 第13天:JUC中的Condition对象 java高并发系列第13篇文章 本文内容 synchronized中实现线程等待和唤醒Condition简介及常用方法介绍及相关示例使用Condition实现生产者消费者使用Condition实现同步阻塞队列Object对象中的wait(),notify()方法,用于线程等待…...
【TTY子系统】printf与printk深入驱动解析
tty子系统解析 tty子系统是一个庞大且复杂,也是内核维护者所头大的子系统。 At a first glance, the TTY layer wouldn’t seem like it should be all that challenging. It is, after all, just a simple char device which is charged with transferring byte-o…...
无涯教程-PHP - 全局变量函数
全局变量 与局部变量相反,可以在程序的任何部分访问全局变量。通过将关键字 GLOBAL 放置在应被识别为全局变量的前面,可以很方便地实现这一目标。 <?php$somevar15;function addit() {GLOBAL $somevar;$somevar;print "Somevar is $somevar";}addit(); ?> …...
shell脚本之循环语句
循环语句 循环含义 将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件 for循环语句 一般知道循环次数使用for循环 第一类 格式1: for名称 in 取值次数;do;done; 格式2: for 名称 in {取值列表} do done# 打印20次 for i i…...
派森 #P122. 峰值查找
描述 给定一个长度为n的列表nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。 (1)峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于; &…...
基础网络详解4--HTTP CookieSession 思考
一、cookie技术思考 一台多用户浏览器发起了三笔请求,将某款产品放入购物车中,A一次,选择了篮球;B两次,第一次选了足球,第二次选了钢笔。如何确认选择篮球、足球、钢笔的请求属于谁呢?如果不确认…...
14. 利用Canvas自制时钟组件
1. 说明 在自定义时钟组件时,使用到的基本控件主要是Canvas,在绘制相关元素时有两种方式:一种时在同一个canvas中绘制所有的部件元素,这样需要不断的对画笔和画布的属性进行保存和恢复,容易混乱;另一种就是…...
微信小程序使用云存储和Markdown开发页面
最近想在一个小程序里加入一个使用指南的页面,考虑到数据存储和减少页面的开发工作量,决定尝试在云存储里上传Markdown文件,微信小程序端负责解析和渲染。小程序端使用到一个库Towxml。 Towxml Towxml是一个可将HTML、Markdown转为微信小程…...
【C++】运算符重载 | 赋值运算符重载
Ⅰ. 运算符重载 引入 ❓什么叫运算符重载? 就是:运用函数,将现有的运算符重新定义,使其能满足各种自定义类型的运算。 回想一下,我们以前运算的对象是不是都是int、char这种内置类型? 那我们自定义的“…...
Python学习 -- 类对象从创建到常用函数
在Python编程中,类是一种强大的工具,用于创建具有共同属性和行为的对象。本篇博客将详细介绍Python中类和对象的创建,类的属性和方法,以及一些常用的类函数,通过丰富的代码例子来帮助读者深入理解。 一、类和对象的创…...
数组分割(2023省蓝桥杯)n种讨论 JAVA
目录 1、题目描述:2、前言:3、动态规划(bug):3、递归 剪枝(超时):4、数学(正解): 1、题目描述: 小蓝有一个长度为 N 的数组 A [A0, A1,…, AN−…...
很好的启用window10专业版系统自带的远程桌面
启用window10专业版系统自带的远程桌面 文章目录 启用window10专业版系统自带的远程桌面前言1.找到远程桌面的开关2. 找到“应用”项目3. 打开需要远程操作的电脑远程桌面功能 总结 前言 Windows操作系统作为应用最广泛的个人电脑操作系统,在我们身边几乎随处可见。…...
TCP定制协议,序列化和反序列化
目录 前言 1.理解协议 2.网络版本计算器 2.1设计思路 2.2接口设计 2.3代码实现: 2.4编译测试 总结 前言 在之前的文章中,我们说TCP是面向字节流的,但是可能对于面向字节流这个概念,其实并不理解的,今天我们要介…...
YOLOX在启智AI GPU/CPU平台部署笔记
文章目录 1. 概述2. 部署2.1 拉取YOLOX源码2.2 拉取模型文件yolox_s.pth2.3 安装依赖包2.4 安装yolox2.5 测试运行2.6 运行报错处理2.6.1 ImportError: libGL.so.1: cannot open shared object file: No such file or directory2.6.2 ImportError: libgthread-2.0.so.0: cannot…...
23种设计模式攻关
👍一、创建者模式 🔖1.1、单例模式 单例模式(Singleton Pattern),用于确保一个类只有一个实例,并提供全局访问点。 在某些情况下,我们需要确保一个类只能有一个实例,比如数据库连接…...
【jsthreeJS】入门three,并实现3D汽车展示厅,附带全码
首先放个最终效果图: 三维(3D)概念: 三维(3D)是一个描述物体在三个空间坐标轴上的位置和形态的概念。相比于二维(2D)只有长度和宽度的平面,三维增加了高度或深度这一维度…...
unity将结构体/列表与json字符串相互转化
编写Unity程序时,面对大量需要传输或者保存的数据时,为了避免编写重复的代码,故采用NewtonJson插件来将定义好的结构体以及列表等转为json字符串来进行保存和传输。 具体代码如下: using System; using System.IO; using Newtons…...
【Vue】vue2项目使用swiper轮播图2023年8月21日实战保姆级教程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、npm 下载swiper二、使用步骤1.引入库声明变量2.编写页面3.执行js 总结 前言 swiper轮播图官网 参考文章,最好先看完他的介绍,再看…...
【算法日志】贪心算法刷题:单调递增数列,贪心算法总结(day32)
代码随想录刷题60Day 目录 前言 单调递增数列 贪心算法总结 前言 今天是贪心算法刷题的最后一天,今天本来是打算刷两道题,其中的一道hard题做了好久都没有做出来(主要思路错了)。然后再总结一下。 单调递增数列 int monotoneIncreasingDigits(int n…...