代码随想录刷题笔记 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 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 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

其实分割问题和组合问题非常类似,分割问题就是 对分割位置 的组合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过不断移动切割的位置来讲所有的情况遍历。

在切割过程中需要注意的是

  1. 一共只能分割三次,因为 IP 是由四个整数组成的
  2. 每次分割时要进行检测

下面来讲解具体的代码实现:

首先就是如何实现字符串的切割:这里用到的方法和上面分割回文字符串相同,也就是通过 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;}

最后就是如何判断分割的部分是否符合标准,总结一下判断标准

  1. 不能是 0 开头的数字
  2. 数字范围在 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 的组合,而子集问题就是收集长度为 0nums.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);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django中事务和锁

目录 一&#xff1a;事务&#xff08;Transactions&#xff09; 二&#xff1a;锁 在Django中&#xff0c;事务和锁是数据库操作中的两个重要概念&#xff0c;它们用于确保数据的完整性和一致性。下面我将分别解释这两个概念在Django中的应用。 一&#xff1a;事务&#xff…

EasyRecovery软件免费版与付费版有哪些功能区别?

免费版的EasyRecovery软件在功能和恢复能力上确实存在一些限制。 首先&#xff0c;在数据恢复方面&#xff0c;免费版通常只能恢复最多1GB的数据。这意味着&#xff0c;如果你需要恢复的数据量超过1GB&#xff0c;你将需要升级到付费版才能完全恢复。 其次&#xff0c;免费版…

车载软件架构 —— Adaptive AUTOSAR软件架构中通信管理、诊断管理策略

车载软件架构 —— Adaptive AUTOSAR软件架构中通信管理、诊断管理策略 第四篇 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(6)特征工程初步

特征工程是一个非常重要的概念&#xff0c;从特征工程可以领会到机器学习的真谛。 特征工程就是从原始数据转换为特征向量的过程。 特征工程的特点&#xff1a; 特征工程是机器学习中很重要的起始步骤&#xff0c;直接影响效果&#xff0c;需要大量的时间。 数据和特征决定了…

【Chrono Engine学习总结】5-sensor-5.2-导出lidar数据的方法与原理探究

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 1、Sensor数据生成流程回顾 Chrono里面&#xff0c;sensor的数据生成、可视化、以及保存&#xff0c;都需要单独进行设置才能实现。sensor数据的采集流程如下https:/…

【LeetCode: 429. N 叉树的层序遍历 + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Landsat8_C2_SR数据集是经大气校正后的地表反射率数据

数据名称&#xff1a; Landsat8_C2_SR 数据来源&#xff1a; USGS 时空范围&#xff1a; 2020年1月-2023年3月 空间范围&#xff1a; 全国 数据简介&#xff1a; Landsat8_C2_SR数据集是经大气校正后的地表反射率数据&#xff0c;属于Collection2的二级数据产品&#…

springboot196高校教师科研管理系统

Spring Boot高校教师科研管理系统设计与实现 摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜…

FlashMeeting(基于FFmpeg+openCV)视频语音通讯系统

Web端体验地址&#xff1a;https://download.csdn.net/download/XiBuQiuChong/88805337 客户端下载地址&#xff1a;https://download.csdn.net/download/XiBuQiuChong/88805337 FlashMeeting(基于FFmpegopenCV)是一整套先进的以FFmpegopenCV技术为基础的视频语音通讯系统。利…

ArcGIS学习(八)基于GIS平台的控规编制办法

ArcGIS学习(八)基于GIS平台的控规编制办法 上一任务我们学习了”如何进行图片数据的矢量化?" 这一关我们来学习一个比较简单的案例一一”如何在ArcGIS中录入控规指标,绘制控规图纸?" 首先,先来看看这个案例的分析思路以及导入CAD格式的控规图纸。 接着,来看…

Eclipse - Expressions Add Watch Expression

Eclipse - Expressions & Add Watch Expression References Window -> Show View -> Other… Show View -> Debug -> Expressions -> Open Debug 模式下出现 Expressions 窗口 Debug 模式下&#xff0c;如果需要查看指定变量或者返回函数的值&#xff0c;直…

19.Qt 组合框的实现和应用

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 1. 界面 2.槽 3.样式表 参考&#xff1a; 前言&#xff1a; 学习QCombox控件的使用 技能&#xff1a; 简单实现组合框效果 内容&#xff1a; 1. 界面 在ui编辑界面找到input widget里面的comboBox&#xff…

源支付V7最新V2.8.6文明版

源支付V7最新V2.8.6文明版 本版不需要授权码 注&#xff1a;开发不易&#xff0c;仅限交流学习使用&#xff0c;如商业使用&#xff0c;请支持正版&#xff01; 轻量化的界面UI,提供更加便捷的操作体验,让您的系统一目了然 推荐支付宝当面付-免CK-商家版&#xff0c;微信推荐…

利用python解决猴子吃桃问题

1 问题 如何运用python程序解决有趣的猴子吃桃数学问题 问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一…

书生浦语-模型微调

大语言模型微调 指令微调的流程 LoRA(旁路分支微调) Xtuner微调框架 微调训练 作业 微调作业需要多训练几个epoch&#xff0c;这里训练了16个epoch

Google Gemini 1.5:引领跨模态AIGC信息分析理解与视频内容推理的新篇章,与 Open AI 决一高下!

Gemini 1.5具有100万token的上下文理解能力&#xff0c;是目前最强&#xff01;具有跨模态理解和推理&#xff1a;能够对文本、代码、图像、音频和视频进行高度复杂的理解和推理。允许分析1小时视频、11小时音频、超过30,000行代码或超过700,000字的文本。不过谷歌这个Gemini 1…

Puppeteer 使用实战:如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客(一)

文章目录 效果展示说明利用工具整体思路Puppeteer 使用笔记保持登录状态打开新的页面点击 dialog跳转页面设置页面可见窗口大小寻找元素等待元素出现 整体代码 效果展示 说明 看了看网上很少做这个功能&#xff0c;但是我有这个需求&#xff0c;就抽出时间写了个简单的工具目前…

19-k8s的附加组件-coreDNS组件

一、概念 coreDNS组件&#xff1a;就是将svc资源的名称解析成ClusterIP&#xff1b; kubeadm部署的k8s集群自带coreDNS组件&#xff0c;二进制部署需要自己手动部署&#xff1b; [rootk8s231 ~]# kubectl get pods -o wide -A k8s系统中安装了coreDNS组件后&#xff0c;会有一个…

解锁Spring Boot中的设计模式—05.策略模式:探索【策略模式】的奥秘与应用实践!

1.策略者工厂模式&#xff08;Map版本&#xff09; 1.需求背景 假设有一个销售系统&#xff0c;需要根据不同的促销活动对商品进行打折或者其他形式的优惠。这些促销活动可以是针对不同商品类别的&#xff0c;比如男装、女装等。 2.需求实现 活动策略接口&#xff1a;定义了…

Java:集合以及集合进阶 --黑马笔记

一、集合概述和分类 1.1 集合的分类 除了ArrayList集合&#xff0c;Java还提供了很多种其他的集合&#xff0c;如下图所示&#xff1a; 我想你的第一感觉是这些集合好多呀&#xff01;但是&#xff0c;我们学习时会对这些集合进行分类学习&#xff0c;如下图所示&#xff1a;…