代码随想录刷题笔记 DAY 28 | 复原 IP 地址 No.93 | 子集 No.78 | 子集 II No.90
文章目录
- Day 28
- 01. 复原 IP 地址(No. 93)
- 1.1 题目
- 1.2 笔记
- 1.3 代码
- 02. 子集(No. 78)
- 2.1 题目
- 2.2 笔记
- 2.3 代码
- 03. 子集 II(No. 90)
- 3.1 题目
- 3.2 笔记
- 3.3 代码
Day 28
01. 复原 IP 地址(No. 93)
题目链接
代码随想录题解
1.1 题目
有效 IP 地址 正好由四个整数(每个整数位于 0
到 255
之间组成,且不能含有前导 0
),整数之间用 '.'
分隔。
- 例如:
"0.1.2.201"
和"192.168.1.1"
是 有效 IP 地址,但是"0.011.255.245"
、"192.168.1.312"
和"192.168@1.1"
是 无效 IP 地址。
给定一个只包含数字的字符串 s
,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s
中插入 '.'
来形成。你 不能 重新排序或删除 s
中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
示例 2:
输入:s = “0000”
输出:[“0.0.0.0”]
示例 3:
输入:s = “101023”
输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]
提示:
1 <= s.length <= 20
s
仅由数字组成
1.2 笔记
如果要更好的理解这道题目,建议先去做一下
分割回文字符串(No. 131)
这里附上我的题解 代码随想录刷题笔记 DAY 26 | 组合总和 No.39 | 组合求和 II No.40 | 分割回文串 No.131
其实分割问题和组合问题非常类似,分割问题就是 对分割位置 的组合。
通过不断移动切割的位置来讲所有的情况遍历。
在切割过程中需要注意的是
- 一共只能分割三次,因为 IP 是由四个整数组成的
- 每次分割时要进行检测
下面来讲解具体的代码实现:
首先就是如何实现字符串的切割:这里用到的方法和上面分割回文字符串相同,也就是通过 index 表示本次切割的起点,通过循环变量 i 表示切割的终点
for (int i = index; i < s.length(); i++) {if ((i - index + 1) <= 3 && isValid(s, index, i)) {pointNum++;path.add(s.substring(index, i + 1));} else {continue;}backtracking(i+1, s);pointNum--;path.remove(path.size() - 1);
}
同时因为一共分割四次的限制,所以需要有一个变量来记录分割的次数 pointNum
分割的终点就是这个 pointNum
达到 3
的时候,也就是分割了三次,这时候要验证最后一段是否符合,如果符合就将其存入结果中
if (pointNum == 3) {if (isValid(s, index, s.length()-1)) {// 对结果的处理String temp = String.join(".", path);temp += ".";temp += s.substring(index, s.length());res.add(temp);}return;}
最后就是如何判断分割的部分是否符合标准,总结一下判断标准
- 不能是 0 开头的数字
- 数字范围在 0 到 255
所以可以得出这样的逻辑:
- 首先判断字符串长度是否小于
3
同时大于0
(避免了转换越界的情况) - 然后判断这个数字是否是以
0
开头的数字 - 再去判断转换的数字是否在规定范围内
其中第一步在上面的 for 循环中已经做过了 if ((i - index + 1) <= 3 && isValid(s, index, i))
这里只需要判断 0
即可
public boolean isValid(String s, int startIndex, int endIndex) {int length = endIndex - startIndex + 1;if (length > 0) {String substr = s.substring(startIndex, endIndex+1);int number = Integer.parseInt(substr);// 表明是含有前导 0 的if (substr.length() > 1 && substr.startsWith("0")) {return false;}// 整数大小不符合规范if (!(number >= 0 && number <= 255)) {return false;}return true;} else {return false;}}
1.3 代码
class Solution {List<String> res = new ArrayList<>();List<String> path = new ArrayList<>(); // 路径变量int num = 0; // 统计分割的次数int pointNum = 0;public List<String> restoreIpAddresses(String s) {backtracking(0, s);return res;}public void backtracking(int index, String s) {if (pointNum == 3) {if (isValid(s, index, s.length()-1)) {String temp = String.join(".", path);temp += ".";temp += s.substring(index, s.length());res.add(temp);}return;}for (int i = index; i < s.length(); i++) {if ((i - index + 1) <= 3 && isValid(s, index, i)) {pointNum++;path.add(s.substring(index, i + 1)); } else {continue;}backtracking(i+1, s);pointNum--;path.remove(path.size() - 1);}}/**判断是否是正确的 IP 地址*/public boolean isValid(String s, int startIndex, int endIndex) {int length = endIndex - startIndex + 1;if (length > 0) {String substr = s.substring(startIndex, endIndex+1);int number = Integer.parseInt(substr);// 表明是含有前导 0 的if (substr.length() > 1 && substr.startsWith("0")) {return false;}// 整数大小不符合规范if (!(number >= 0 && number <= 255)) {return false;}return true;} else {return false;}}
}
02. 子集(No. 78)
题目链接
代码随想录题解
2.1 题目
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
2.2 笔记
子集问题其实就是组合问题的一种变式,组合问题是收集长度为 k
的组合,而子集问题就是收集长度为 0
到 nums.length
的所有组合。
这也就导致了其收集结果的位置和组合问题不同
这是收集长度为 2
的组合的递归树
这是收集子集的递归树
上述粉色的部分表示收集的结果,可以看出,子集就是对每个节点都做了信息的收集
for (int i = index; i < nums.length; i++) {path.add(nums[i]);res.add(new ArrayList(path));backtracking(i+1, nums);path.remove(path.size() - 1);
}
就是讲 res.add()
放到了 for
循环中
递归的终点就是起点越界的时候:
if (index > nums.length - 1) {return;
}
最后不要忘记将空集加上即可
2.3 代码
class Solution {List<Integer> path = new ArrayList<>();List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {res.add(new ArrayList<>());backtracking(0, nums);return res;}public void backtracking(int index, int[] nums) {if (index > nums.length - 1) {return;}for (int i = index; i < nums.length; i++) {path.add(nums[i]);res.add(new ArrayList(path));backtracking(i+1, nums);path.remove(path.size() - 1);}}
}
03. 子集 II(No. 90)
题目链接
代码随想录题解
3.1 题目
给你一个整数数组 nums
,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
3.2 笔记
做过 组合总和II 的朋友对这种题目一定不陌生,这道题目其实就是 组合总和II 与上一题 子集的结合,组合总和II 的详解在这里,建议先做完再来尝试本题。
代码随想录刷题笔记 DAY 26 | 组合总和 No.39 | 组合求和 II No.40 | 分割回文串 No.131
本题的特点就是题目中出现了有相同元素的数组,所以需要做到层级去重,收集结果的方式和上面一题完全相同,这里直接给出代码。
3.3 代码
class Solution {List<Integer> path = new ArrayList<>();List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> subsetsWithDup(int[] nums) {Arrays.sort(nums);res.add(new ArrayList<>());backtracking(0, nums);return res;}public void backtracking(int index, int[] nums) {// 和上题相同的出口if (index > nums.length - 1) {return;}for (int i = index; i < nums.length; i++) {// 层级的去重if (i > index && nums[i-1] == nums[i]) {continue;} else {path.add(nums[i]);}res.add(new ArrayList<>(path));backtracking(i+1, nums);path.remove(path.size() - 1);}}
}
相关文章:

代码随想录刷题笔记 DAY 28 | 复原 IP 地址 No.93 | 子集 No.78 | 子集 II No.90
文章目录 Day 2801. 复原 IP 地址(No. 93)1.1 题目1.2 笔记1.3 代码 02. 子集(No. 78)2.1 题目2.2 笔记2.3 代码 03. 子集 II(No. 90)3.1 题目3.2 笔记3.3 代码 Day 28 01. 复原 IP 地址(No. 9…...

LeetCode LCR 085. 括号生成
题目链接https://leetcode.cn/problems/IDBivT/description/ 正整数 n 代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 class Solution {public List<String> generateParenthesis(int n) {List<String>…...

django定时任务(django-crontab)
目录 一:安装django-crontab: 二:添加django_crontab到你的INSTALLED_APPS设置: 三:运行crontab命令来创建或更新cron作业: 四:定义你的cron作业 五:创建你的管理命令ÿ…...

【教3妹学编程-算法题】输入单词需要的最少按键次数 II
2哥 : 叮铃铃,3妹,准备复工了啊,过年干嘛呢,是不是逛吃逛吃,有没有长胖呢。 3妹:切,不想上班,假期能不能重来一遍啊,虽然在家我妈张罗着要给我相亲呢。可是在家还是很好的…...

突破编程_C++_高级教程(多线程编程实例)
1 生产者-消费者模型 生产者-消费者模型是一种多线程协作的设计模式,它主要用于处理生产数据和消费数据的过程。在这个模型中,存在两类线程:生产者线程和消费者线程。生产者线程负责生产数据,并将其放入一个共享的数据缓冲区&…...

精读《Function Component 入门》
1. 引言 如果你在使用 React 16,可以尝试 Function Component 风格,享受更大的灵活性。但在尝试之前,最好先阅读本文,对 Function Component 的思维模式有一个初步认识,防止因思维模式不同步造成的困扰。 2. 精读 什…...

类的构造方法
在类中,出成员方法外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每个类实例化一个对象时,类都会自动调用构造方法。 构造方法的特点: 构…...

ChatGPT和LLM
ChatGPT和LLM(大型语言模型)之间存在密切的关系。 首先,LLM是一个更为抽象的概念,它包含了各种自然语言处理任务中使用的各种深度学习模型结构。这些模型通过建立深层神经网络,根据已有的大量文本数据进行文本自动生成…...

「优选算法刷题」:判定字符是否唯一
一、题目 实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 示例 1: 输入: s "leetcode" 输出: false 示例 2: 输入: s "abc" 输出: true限制: 0 < len(s) < 100 s[i]仅包含小写字母 二…...

详解自定义类型:枚举与联合体!
目录 编辑 一、枚举类型 1.枚举类型的声明 2.枚举类型的优点 3.枚举类型的使用 二、联合体类型(共用体) 1.联合体类型的声明 2.联合体的特点 3.相同成员的结构体和联合体的对比 4.联合体大小的计算 5.用联合体判断大小端 三.完结散花 悟已往之不谏&…...

第13章 网络 Page738~741 13.8.3 TCP/UDP简述
libcurl是C语言写成的网络编程工具库,asio是C写的网络编程的基础类型库 libcurl只用于客户端,asio既可以写客户端,也可以写服务端 libcurl实现了HTTP\FTP等应用层协议,但asio却只实现了传输层TCP/UDP等协议。 在学习http时介绍…...

Tomcat要点总结
一、Tomcat 服务中部署 WEB 应用 1.什么是Web应用 (1) WEB 应用是多个 web 资源的集合。简单的说,可以把 web 应用理解为硬盘上的一个目录, 这个目录用于管理多个 web 资源。 (2)Web 应用通常也称之为…...

Ubuntu 20.04 安装RVM
RVM是管理Ruby版本的工具,使用RVM可以在单机上方便地管理多个Ruby版本。 下载安装脚本 首先使下载安装脚本 wget https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer 如果出现了 Connection refused 的情况, 可以考虑执行以下命令修改dns,再执…...

Ps:污点修复画笔工具
污点修复画笔工具 Spot Healing Brush Tool专门用于快速清除图像中的小瑕疵、污点、尘埃或其他不想要的小元素。 它通过分析被修复区域周围的内容,无需手动取样,自动选择最佳的修复区域来覆盖和融合这些不完美之处,从而实现无痕修复的效果。 …...

JAVA面试题17
什么是Java中的静态内部类?它与非静态内部类有什么区别? 答案:静态内部类是定义在另一个类中的类,并且被声明为静态。与非静态内部类不同,静态内部类不依赖于外部类的实例,可以直接访问外部类的静态成员。 …...

数据备份和恢复
数据备份和恢复 什么情况下会用到数据备份呢 数据丢失的场景 人为误操作造成的某些数据被误操作 软件BUG造成数据部分或者全部丢失 硬件故障造成数据库部分或全部丢失 安全漏洞被入侵数据恶意破坏 非数据丢失场景 基于某个时间点的数据恢复 开发测试环境数据库搭建 相同数据库的…...

核心篇 - 集成IS-IS配置实战
文章目录 一. 实验专题1.1. 实验1:配置单区域集成IS-IS1.1.1. 实验目的1.1.2. 实验拓扑1.1.3. 实验步骤(1)配置IP地址(2)配置IS-IS 1.1.4. 实验调试(1)查看邻接表(2)查看…...

【OpenAI Sora】开启未来:视频生成模型作为终极世界模拟器的突破之旅
这份技术报告主要关注两个方面:(1)我们的方法将各种类型的视觉数据转化为统一的表示形式,从而实现了大规模生成模型的训练;(2)对Sora的能力和局限性进行了定性评估。报告中不包含模型和实现细节…...

MVC 、DDD、中台、Java SPI(Service Provider Interface)
文章目录 引言I 单体架构DDD实现版本1.1 核心概念1.2 DDD四层架构规范1.3 案例1.4 请求转发流程II 领域服务调用2.1 菱形对称架构2.2 中台III Java SPI3.1 概念3.2 实现原理3.3 例子:本地SPI找服务see alsojava -cp</...

C++单例模式的实现
单例模式就是在整个程序运行期都只有一个实例。在代码实现方面,我们要限制new出多于一个对象这种情况的发生。而不是仅仅依靠无保障的约定。 目前大多数的编程语言的做法都是私有化构造函数,对外提供一个获取实例的接口。这样做的目的使实例的创建不能在…...

rust函数 stuct struct方法 关联函数
本文结合2个代码实例主要介绍了rust函数定义方法,struct结构体定义、struct方法及关联函数等相关基础知识。 代码1: main.rc #[derive(Debug)]//定义一个结构体 struct Ellipse {max_semi_axis: u32,min_semi_axis: u32, }fn main() {//椭圆࿰…...

浅谈基于中台模式的大数据生态体系的理解
这篇文章主要浅谈一下我对大数据生态体系建设的理解。 大数据生态系统为高并发,高吞吐,高峰值,高堆积等大规模数据的采集,处理,计算,存储,服务提供了完善的处理体系,致力于打造核心数…...

MySQL的锁机制
一:概述 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢); 在数据库中,除传统的计算资源(如CPU,RAM,I/O等)的争用以外,数据也是一种供许多用…...

已解决ImportError: cannot import name ‘PILLOW_VERSION‘异常的正确解决方法,亲测有效!!!
已解决ImportError: cannot import name PILLOW_VERSION异常的正确解决方法,亲测有效!!! 文章目录 问题分析 报错原因 解决思路 解决方法 总结 在Python项目开发中,依赖管理是保证项目正常运行的关键环节。然而&…...

力扣:300. 最长递增子序列
动态规划: 1. 先定义dp数组来表示在下标为i时最长递增子序列,先初始化一下每个下标的值为dp【i】1。同时我们要判断在下标i之前的最长的递增子序列为多少,在判断当前的下标i是否满足递增的条件满足的话就进行dp【i】的重新赋值。之后要更新接受的最长递…...

Swing程序设计(10)列表框,文本框,文本域,密码框
文章目录 前言一、列表框二、文本框(域) 1.文本框2.文本域三、密码框总结 前言 该篇文章简单介绍了Java中Swing组件里的列表框、文本框、密码框。 一、列表框 列表框(JList)相比下拉框,自身只是在窗体上占据固定的大小…...

【Java八股面试系列】JVM-常见参数设置
目录 堆内存相关 显式指定堆内存–Xms和-Xmx 显式新生代内存(Young Generation) 显式指定永久代/元空间的大小 垃圾收集相关 垃圾回收器 GC 日志记录 处理 OOM JDK监控和故障处理工具总结 堆内存相关 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线…...

【Python--Web应用框架大比较】
🚀 作者 :“码上有前” 🚀 文章简介 :Python 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Django Django太重了,除了web框架,自带ORM和模板引擎,灵活和自由度不…...

Effective Objective-C 学习第三周
理解引用计数 Objective-C 使用引用计数来管理内存:每个对象都有个可以递增或递减的计数器。如果想使某个对象继续存活,那就递增其引用计数:用完了之后,就递减其计数。计数变为 0时,就可以把它销毁。 在ARC中…...

人工智能学习与实训笔记(四):神经网络之NLP基础—词向量
人工智能专栏文章汇总:人工智能学习专栏文章汇总-CSDN博客 本篇目录 四、自然语言处理 4.1 词向量 (Word Embedding) 4.1.1 词向量的生成过程 4.1.2 word2vec介绍 4.1.3 word2vec:skip-gram算法的实现 4.2 句向量 - 情感分析 4.2.1 LSTM (Long S…...