当前位置: 首页 > news >正文

【算法练习Day23】 复原 IP 地址子集子集 II

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 复原 IP 地址
  • 子集
  • 子集 II
  • 总结:

复原 IP 地址

93. 复原 IP 地址 - 力扣(LeetCode)
在这里插入图片描述

复原IP地址这道题也是一道切割字符串的问题,也是略有难度的一道题,起初我做的时候,想不通是怎么精确的把字符串分割成四段做终止条件的,后来看了题解知道,并不是一开始就能够确定切出多大一块,而是一点点试错的,虽然我们知道,是要将该字符串序列分成四份,由三个点分割开来,但是我们代码实现时候是无法做到一开始就确定前半部分是切割前几个数字的,这是因为字符串序列可能是不一样的,题目要求数字前面不能由前导0构成,只有0是可以的,且每一块分割出来的数字大于等于0小于等于255,由于字符序列的不同,有的时候我们第一次只能切一个数字,就是0的情况,0不能做前导,有的时候我们可以多切一点,这是无法固定的,所以我们要一点点切割递归下去,好在我们有函数递归可以帮助我们完成这一难题。

其他的困难部分我们在上一期的切割回文子串已经讲的差不多了,无非也就是如何表示切割线,如何传进去切割区间做判断,不明白可以去看上一期。

区别在于,这道题的终止判断条件也是有所不同的,它的终止条件是我们已经放入了三个逗点做分割了,这时候我们进入终止判断,分割问题,通常都是由题目要求的关键信息,作为终止条件,它和这几期做的那些组合题不一样,不是固定的套路,需要自行想出。

class Solution {
private:vector<string> result;// 记录结果// startIndex: 搜索的起始位置,pointNum:添加逗点的数量void backtracking(string& s, int startIndex, int pointNum) {if (pointNum == 3) { // 逗点数量为3时,分隔结束// 判断第四段子字符串是否合法,如果合法就放进result中if (isValid(s, startIndex, s.size() - 1)) {result.push_back(s);}return;}for (int i = startIndex; i < s.size(); i++) {if (isValid(s, startIndex, i)) { // 判断 [startIndex,i] 这个区间的子串是否合法s.insert(s.begin() + i + 1 , '.');  // 在i的后面插入一个逗点pointNum++;backtracking(s, i + 2, pointNum);   // 插入逗点之后下一个子串的起始位置为i+2pointNum--;                         // 回溯s.erase(s.begin() + i + 1);         // 回溯删掉逗点} else break; // 不合法,直接结束本层循环}}// 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法bool isValid(const string& s, int start, int end) {if (start > end) {return false;}if (s[start] == '0' && start != end) { // 0开头的数字不合法return false;}int num = 0;for (int i = start; i <= end; i++) {if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法return false;}num = num * 10 + (s[i] - '0');if (num > 255) { // 如果大于255了不合法return false;}}return true;}
public:vector<string> restoreIpAddresses(string s) {result.clear();if (s.size() < 4 || s.size() > 12) return result; // 算是剪枝了backtracking(s, 0, 0);return result;}
};

还有三点需要注意的细节,第一点是除了在for循环里要判断该切割区间是否合法,我们在终止条件还要额外判断一次,这为什么呢?原因在于我们终止条件是三个逗点就插入字符串,而我们之前只是判断了三次切割串是否合法,因为判断一次要放一个标点所以肯定是只判断了三次,我们在这里加一次判断的目的是为了知道,这最后剩余的部分是否依然具有合法性。第二点是字符串的insert成员函数插入标点是传入下标的前一个位置,所以要进行+1传入,而且我们在进行递归下一层时,传入的下一层开始遍历起始位置是i+2,而不是i+1,因为加入了一个标点的缘故。第三点是判断部分代码的细节,下面的for循环来依次取各个数相加判断和是否大于255,其实这里的要点主要在于对每一个字符的判断,防止它是字符1-9之外的数,但是leetcode上已经明确说了传入的都是数字序列,可是题目仍然要求判断,感觉可能是题目描述没有全改过来的缘故。

子集

78. 子集 - 力扣(LeetCode)
在这里插入图片描述

子集问题和前面讲过很多的组合问题,解法如出一辙,只是在处理数据加入结果集里有所不同。

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集,要放在终止添加的上面,否则会漏掉自己if (startIndex >= nums.size()) { // 终止条件可以不加return;}for (int i = startIndex; i < nums.size(); i++) {path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}
public:vector<vector<int>> subsets(vector<int>& nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};

和组合问题一样,需要注意的是处理数据,是每一次都将节点放入结果数组,因为求的是子集要保留所有的节点,每一个节点都是它的子集,所以不存在剪枝操作。那空集是如何放入的呢?实际上就是没有节点时候直接放入了path,这一点也很好理解。单层递归是用一个for循环这一点就是组合的内容,不懂的可以翻看前面组合的章节。

子集 II

90. 子集 II - 力扣(LeetCode)
在这里插入图片描述

子集II整体代码和子集差不多,只是加入了组合的去重逻辑。

class Solution {
public:vector<vector<int>>result;vector<int>path;void backtraking(vector<int>&nums,int start,vector<int>&nums2){result.push_back(path);for(int i=start;i<nums.size();i++){if(i>=1&&nums[i]==nums[i-1]&&nums2[i-1]==0)continue;nums2[i]=1;path.push_back(nums[i]);backtraking(nums,i+1,nums2);path.pop_back();nums2[i]=0;}}vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<int>nums2(nums.size(),0);sort(nums.begin(),nums.end());backtraking(nums,0,nums2);return result;}
};

用一个辅助数组记录我们所要添加数的数组,各个数字的加入情况。这里再简单讲一下去重的逻辑,画一个树形图辅助理解,当我们在一个数组里加入元素,这道题说是给定数组有重复元素,当我们构成一个答案数据时候i,由于每次递归会i+1,走到下一个数据位置,作为下一次放元素的起始位置,所以我们不需要担心会一个数据取两次,但是如果有两个数据,我们第一次用到它取的一系列答案数据,再你第二次用到的时候会将这些答案数据又取一次,因为第一次用的这个数字包含了你第二次用的时候取到的全部答案了,这一点画出树形图很容易理解,所以要将它去掉,也就是去重的逻辑,需要做的是将给定数组排序,让重复数据挨在一起,然后用一个数组去辅助做判断,如果本次要放入的数据和上一个位置数据值相等,且上一个相等数据本次没有放入,则说明我们要删除它,这是数层上的去重逻辑。

总结:

今天我们完成了复原 IP 地址、子集、子集 II三道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

相关文章:

【算法练习Day23】 复原 IP 地址子集子集 II

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 复原 IP 地址子集子集 II总…...

fastadmin框架token验证

在FastAdmin框架中&#xff0c;Token验证是一种常见的身份验证方法&#xff0c;用于确保用户请求的安全性和合法性。本文将介绍如何在FastAdmin框架中实现Token验证。 什么是Token验证&#xff1f; Token验证是一种基于令牌(Token)的身份验证方式。在这种方式下&#xff0c;用…...

了解 AI :了解 AI 方面的一些术语 (中英文对照)

本心、输入输出、结果 文章目录 了解 AI &#xff1a;了解 AI 方面的一些术语 &#xff08;中英文对照&#xff09;前言AI 方面的一些术语 &#xff08;中英文对照&#xff09;AI 方面的一些术语 &#xff08;中英文对照&#xff09; - 文字版弘扬爱国精神 了解 AI &#xff1a…...

【Python学习笔记】对象、方法

1. 对象方法定义 对象通常都拥有属于自己的 方法&#xff08;英文叫 method &#xff09;。 对象的方法其实可以看成是对象所拥有的函数。也就是说 这个方法&#xff0c;是属于这个对象的函数。 调用对象的方法&#xff0c;和调用函数差不多&#xff0c;只要在前面加上 所属…...

企业IT资产设备折旧残值如何计算

环境&#xff1a; 企业/公司 IT资产 问题描述&#xff1a; 企业IT设备折旧残值如何计算&#xff1f; 解决方案&#xff1a; 1.按三年折旧 净值原值-月折旧额折旧月份 &#xff0c; 月折旧额原值(1-3%)/36 折旧月份ROUND(E2*(1-3%)/36,2) 2.净值E2-F2*G2...

Linux性能优化--性能工具:下一步是什么

13.0 概述 本章是对一些事情的思索&#xff0c;包括&#xff1a;Linux性能工具的当前状态&#xff0c;哪些仍需要改进以及为什么Linux是当前一个相当不错的进行性能调查的平台。 阅读本章后&#xff0c;你将能够&#xff1a; 了解Linux性能工具箱的漏洞&#xff0c;以及一些理…...

网工内推 | IT主管、高级网工,上市公司,必须持有HCIE认证

01 深圳市飞荣达科技股份有限公司 招聘岗位&#xff1a;高级网络工程师 职责描述&#xff1a; 1. 参与、负责集团公司IT基础技术架构的规划设计、实施及维护、性能优化&#xff0c;包括数据中心机房、网络架构、虚拟化平台、信息安全设备及灾备系统等&#xff1b; 2. 负责集团…...

bulldog 靶机

bulldog 信息搜集 存活检测 详细扫描 后台网页扫描 网页信息搜集 正在开发的如果你正在读这篇文章&#xff0c;你很可能是Bulldog Industries的承包商。恭喜你!我是你们的新老板&#xff0c;组长艾伦布鲁克。CEO解雇了整个开发团队和员工。因此&#xff0c;我们需要迅速招到一…...

如何借助边缘智能网关打造智慧城市便民驿站

智慧城市驿站是一类提供多样化便利服务的新型智能公共设施&#xff0c;通过融合物联网技术、边缘智能技术、新能源技术等&#xff0c;为城市居民整合提供休闲、购物、卫生、广告、安全等公共服务&#xff0c;进一步提升日常生活体验。本篇就为大家介绍如何基于边缘智能网关&…...

谈谈电商App的压测

背景 最近恰逢双十一&#xff0c;大大小小的电商app在双十一之前都会做一次压测&#xff0c;曾经在小公司工作的时候很想知道大公司是如何压测的&#xff0c;有什么高深的压测工具没&#xff0c;本文就来揭露一下 压测真相 在确认使用什么压测工具进行压测之前&#xff0c;我…...

​VsCode修改侧边栏字体大小——用缩放的方法​

缩放界面字体百分比&#xff08;包括编辑器界面&#xff09; 如果只修改文本编辑区的字体大小&#xff0c;可以在File -> Preferences -> Settings 中修改font的大小。但是侧边栏的字体不会改变&#xff0c;所以可以使用缩放的方法先修改整个界面的字体大小&#xff0c;…...

基于Java的农资采购销售管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

【AIGC核心技术剖析】扩大富有表现力的人体姿势和形状估计SMPLer-X模型

富有表现力的人体姿势和形状估计 (EHPS) 将身体、手和面部运动捕捉与众多应用结合起来。尽管取得了令人鼓舞的进展,但当前最先进的方法仍然在很大程度上依赖于有限的训练数据集。在这项工作中,我们研究了将 EHPS 扩展到第一个通用基础模型(称为 SMPLer-X),以 ViT-Huge 作为…...

【C++面向对象】1. 类、对象

文章目录 【 1. 类 & 对象的定义 】1.1 类的定义1.2 对象的定义 【 2. 类的成员 】2.1 数据成员2.2 成员函数类的内部定义成员函数类的外部定义成员函数成员函数的访问实例 【 3. 类的访问修饰符 】3.1 public 公有成员3.2 private 私有成员3.3 protected 保护成员3.4 继承…...

PAM从入门到精通(十三)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;十二&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构&#xff1a; ​ 更加形象的形式&#xff1a; ​ 五、主要函数详解 11. pam_open_session 概述&…...

Stable Diffusion WebUI几种解决手崩溃的方法

1. 添加与手相关负面提示词 如何提价提示词呢? 首先有一个embeddings模型文件bad-hands-5,我们可以去各个大模型网站去搜,我是在C站上面下载的。 附上C站地址:https://civitai.com/ 下载好之后,你需要将文件放入stable-diffusion-webui\embeddings目录中。位置如下所示…...

kr 第三阶段(一)16 位汇编

为什么要学习 16 位汇编&#xff1f; 16 位汇编包含了大部分 32 位汇编的知识点。有助于在学习内核的两种模式。 实模式&#xff1a;访问真实的物理内存保护模式&#xff1a;访问虚拟内存 有助于提升调试能力&#xff0c;调试命令与 OllyDbg 和 WinDebug 通用。可以学习实现反…...

power point导出pdf保留字体

在 slides 中用到非自带的字体&#xff0c;如 [1]&#xff0c;想导出成 pdf 文件&#xff08;因为导出成图&#xff0c;如 png&#xff0c;放大会蒙&#xff09;&#xff0c;并在别人电脑里也保留字体。除了让别人也装上相应字体&#xff0c;可以&#xff1a; 参考 [2]&#x…...

云务器迁移(腾讯云>华为云)

自己平时除了写些bug外还喜欢玩玩服务器&#xff0c;这不前几年买了一个域名&#xff0c;当时服务器买的是阿里云的&#xff0c;想着域名备案挺麻烦的就一直用着&#xff0c;只是在服务器到期后会重新购买其他运营商的&#xff08;关键是续不起&#x1f92b;&#xff09; 这不最…...

[USACO11MAR] Brownie Slicing G题解(二分+二维前缀和+矩阵分割)

[USACO11MAR] Brownie Slicing G 题目地址 P3017 [USACO11MAR] Brownie Slicing G 思路 二分最大化最小值 切割思路&#xff1a; 一行一行进行切割&#xff0c;如果这一行可以切割出b块大于等于mid的块&#xff0c;就开始切割下一行 如果无法切割出b块&#xff0c;就把正在…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...