代码随想录刷题笔记 DAY 28 | 复原 IP 地址 No.93 | 子集 No.78 | 子集 II No.90

news2025/1/27 12:38:48

文章目录

    • 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.coloradmin.cn/o/1454181.html

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

相关文章

SAP BC Partner XXXX:3299 not reached

带SAProuter 出现如下问题 不带SAProuer 正常登录 原因&#xff1a;SAProuter 服务未开启。 开启过程如下&#xff1a; 进入对应的SAProuter 目录 一般是SAProuter 服务器上 cmd进入目录 执行 saprouter.exe -r -V 2 -G saprouter.og -K "p:CNsap-router, OU0000725…

手把手一起开发SV4E-I3C设备(二)

JEDEC DDR5 SPD Hub Devices例程 DDR5生态系统的核心是SidebandBus Protocol 参考下图&#xff0c;可以将SV4E-I3C的端口1声明为主服务器(模拟主机控制器)&#xff0c;并且它可以属于SV4E-I3C上的一个总线。端口2可以作为SPD Hub DUT的Local Bus侧的从站连接。这个从站可以被…

JWT和base64

1.1 jwt和token 1.1.1 token介绍 令牌&#xff08;Token&#xff09;&#xff1a;在计算机领域&#xff0c;令牌是一种代表某种访问权限或身份认证信息的令牌。它可以是一串随机生成的字符或数字&#xff0c;用于验证用户的身份或授权用户对特定资源的访问。 简单理解 : 每个…

【解决(几乎)任何机器学习问题】:处理分类变量篇(上篇)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 本章因太长所以分为上下篇来上传&#xff0c;请敬请期待 很多⼈在处理分类变量时都会遇到很多困难&#xff0c;因此这值得⽤整整⼀章的篇幅来讨论。在本章中&#xff0c;我将 讲述不同…

H5028B 车灯舞台灯 PWM调光 可温控 48V 60V 72V 80V 100V降压芯片

带温控功能的降压恒流芯片的工作原理如下&#xff1a; 降压功能&#xff1a;首先&#xff0c;芯片会监测输入电压&#xff0c;并通过内部的电路将输入电压降低到所需的输出电压水平。这可以通过开关电源转换技术实现&#xff0c;例如脉冲宽度调制&#xff08;PWM&#xff09;或…

2024年【熔化焊接与热切割】考试题库及熔化焊接与热切割考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试题库考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割考试报名题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割模拟考试题库很简单。 1、【单选题】…

硬错误-STM32

需要修改栈大小 还得是野火的文档比较讲得深一点。

图解linux零拷贝技术

转发自&#xff1a;https://zhuanlan.zhihu.com/p/442771856 1、数据拷贝基础过程 在Linux系统内部缓存和内存容量都是有限的&#xff0c;更多的数据都是存储在磁盘中。对于Web服务器来说&#xff0c;经常需要从磁盘中读取数据到内存&#xff0c;然后再通过网卡传输给用户&am…

第13章 网络 Page741~744 asio核心类 ip::tcp::socket

1. ip::tcp::socket liburl库使用"curl*" 代表socket 句柄 asio库使用ip::tcp::socket类代表TCP协议下的socket对象。 将“句柄”换成“对象”,因为asio库是不打折扣的C库 ip::tcp::socket提供一下常用异步操作都以async开头 表13-3 tcp::socket提供的异步操作 …

ElementUI Form:Cascader 级联选择器

ElementUI安装与使用指南 Cascader 级联选择器 点击下载learnelementuispringboot项目源码 效果图 el-cascader.vue&#xff08;Cascader 级联选择器&#xff09;页面效果图 项目里el-cascader.vue代码 <script> let id 0; export default {name: el_cascader,dat…

根据Ruoyi做二开

Ruoyi二开 前言菜单代码生成新建微服务网关添加微服务的路由 vue页面和对应的js文件js中方法的url和controller中方法的url总结 前言 之前写过一篇文章&#xff0c;若依微服务版本搭建&#xff0c;超详细&#xff0c;就介绍了怎么搭建若依微服务版本&#xff0c;我们使用若依就…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(2)项目开发周期

我们来学习项目开发的周期。 再次声明&#xff0c;本文来自腾讯AI课的学习笔记&#xff0c;图片和文字&#xff0c;仅用于大家学习&#xff0c;想了解更多知识&#xff0c;请访问腾讯云相关章节。如果争议&#xff0c;请联系作者。 今天&#xff0c;我们来学习AI项目的周期。 主…

基于python的企业编码管理系统源码【附下载】

《企业编码生成系统》程序使用说明 在PyCharm中运行《企业编码生成系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&#xff0c;只需要输入对应的数字即可。 图1 系统主界面 具体的操作步骤如下&#xff1a;…

如何选择阿里云服务器配置?阿里云服务器CPU内存带宽攻略

阿里云服务器配置怎么选择&#xff1f;根据实际使用场景选择&#xff0c;个人搭建网站可选2核2G配置&#xff0c;访问量大的话可以选择2核4G配置&#xff0c;企业部署Java、Python等开发环境可以选择2核8G配置&#xff0c;企业数据库、Web应用或APP可以选择4核8G配置或4核16G配…

QML | 属性特性(property)

一、属性特性 属性是对象的一个特性,可以分配一个静态的值,也可以绑定一个动态表达式。属性的值可以被其他对象读取。一般而言,属性的值也可以被其他对象修改,除非显式声明不允许这么做,也就是声明为只读属性。 1.定义属性特性 属性可以在C++中通过注册一个类的Q_PROPERT…

推荐几个漏洞扫描工具

渗透测试收集信息完成后&#xff0c;就要根据所收集的信息&#xff0c;扫描目标站点可能存在的漏洞了&#xff0c;包括我们之前提到过的如&#xff1a;SQL注入漏洞、跨站脚本漏洞、文件上传漏洞、文件包含漏洞及命令执行漏洞等&#xff0c;通过这些已知的漏洞&#xff0c;来寻找…

matlab代码--汉明码通过不同信道的误码率分析

1 前言 汉明码是在原数据中的一些固定位置&#xff0c;插入一个0&#xff08;或1&#xff09;&#xff0c;以进行奇&#xff08;或偶&#xff09;校验位&#xff0c;虽然使原数据变长&#xff0c;但可使其拥有纠错能力。能侦测并更正一个比特的错误&#xff1b;若有两个比特出…

京东平台的行业数据(数据分析报告)在哪里看?如何获取?

京东行业分析数据获取可通过以下途径&#xff1a; 京东官方不定期会发布行业白皮书或市场研究报告&#xff0c;商家可以关注京东官网、官方公众号、官方论坛等渠道获取最新发布的研究报告。 对于有技术开发能力的企业&#xff0c;可以通过申请接入京东开放平台API&#xff…

电脑竖屏显示了怎么回复原状

电脑屏幕变成这样 怎么恢复原状&#xff1f; 1、登录系统 2、在桌面上空白点击鼠标右键 3、在右键菜单中选择“屏幕分辨率”&#xff0c;左键点击打开 4、在窗口中“方向”位置选择“横向” 5、保存设置win7桌面即可恢复到正常状态

Arduino的PWM功能应用:会呼吸的灯

目录 概述 1 认识PWM 1.1 PWM原理 1.2 PWM的应用 1.3 在Arduino中使用PWM 2.硬件 2.1 硬件结构 2.2 线路连接 3 软件 3.1 编译和下载代码 3.2 详细代码 4 测试 4.1 灯的变化测试 4.2 使用逻辑分析仪看波形 概述 本文通过一个简单的案例&#xff0c;介绍Arduino中P…