代码随想录算法训练营第二十七天|93.复原IP地址、 78.子集、90.子集II

93.复原IP地址

在这里插入图片描述

题目链接:93.复原IP地址
文档讲解:代码随想录
状态:还行,判断字符是否有效卡了好久

思路:通过回溯算法遍历所有可能的分割方式,每个IP地址段必须是0到255之间的整数且不能有前导零,当选满4个合法段且字符串用完时加入结果集,否则立即回溯。

题解:

    List<String> res = new ArrayList<>(); // 存储所有可能的IP地址结果StringBuilder sb = new StringBuilder(); // 用于构建当前的IP地址public List<String> restoreIpAddresses(String s) {// 边界条件判断,如果字符串为空,或者长度不符合IP地址的规则,则直接返回空列表if (s == null || s.length() < 4 || s.length() > 12) {return res;}char[] chars = s.toCharArray(); // 将字符串转换为字符数组,方便处理backtracking(chars, 0, 0); // 调用回溯方法处理字符数组return res; // 返回结果列表}// 回溯方法,参数分别为字符数组 chars、起始索引 startIndex、当前深度 kpublic void backtracking(char[] chars, int startIndex, int k) {// 如果深度为4,且字符串长度加上3个点正好等于原始长度+4,表示找到一个合法IP地址if (k == 4 && sb.length() == chars.length + 4) {res.add(sb.substring(0, sb.length() - 1)); // 去掉最后一个点,并加入结果列表return;}// 遍历从startIndex开始的连续1到3个字符for (int i = startIndex; i < startIndex + 3 && i < chars.length; i++) {// 判断当前选取的子字符串是否合法if (isValid(chars, startIndex, i)) {int len = sb.length(); // 记录添加数字前的长度sb.append(chars, startIndex, i - startIndex + 1).append('.'); // 将子字符串添加到sb中backtracking(chars, i + 1, k + 1); // 递归调用,深度加1sb.setLength(len); // 回溯时恢复到之前的长度,删除最后添加的子字符串及点}}}// 判断字符数组中从 begin 到 end 索引的数字是否合法public boolean isValid(char[] chars, int start, int end) {// 如果0开头且长度大于1,则为不合法情况,返回falseif (chars[start] == '0' && end > start) {return false;}// 将字符数组的一部分转换为整数int num = Integer.parseInt(new String(chars, start, end - start + 1));// 判断数字是否在合法范围内return num <= 255 && num >= 0;}

78.子集

在这里插入图片描述

题目链接:78.子集
文档讲解:代码随想录
状态:还行

思路:子集问题就是收集路径,不过要加上一个空子集。在收集路径的时候可以利用深度,也可以利用startIndex来控制什么时候收集结束。

题解:

    List<List<Integer>> res = new ArrayList<>(); // 存储所有子集的列表LinkedList<Integer> list = new LinkedList<>(); // 用于构建当前子集的链表// 主方法,入口点,传入数组 numspublic List<List<Integer>> subsets(int[] nums) {backtracking(nums, 0, 0); // 调用回溯方法处理数组 numsreturn res; // 返回结果列表}// 回溯方法,参数分别为数组 nums、起始索引 startIndex、当前深度 kpublic void backtracking(int[] nums, int startIndex, int k) {if (k < nums.length) {res.add(new ArrayList<>(list)); // 将当前子集加入结果列表}if (k == nums.length) {res.add(new ArrayList<>(list)); // 将当前子集加入结果列表return;}/* 或者这样写也可以res.add(new ArrayList<>(path));if (startIndex >= nums.length) {return;}*/// 遍历从 startIndex 开始的数组元素for (int i = startIndex; i < nums.length; i++) {list.add(nums[i]); // 将当前元素加入子集中backtracking(nums, i + 1, k + 1); // 递归调用,深度加1list.removeLast(); // 回溯,移除最后添加的元素,继续寻找其他子集}}

90.子集II

在这里插入图片描述

题目链接:90.子集II
文档讲解:代码随想录
状态:还行,卡了小会儿

思路:对于给定的元素中存在重复的情况可以使用排序+used数组来跳过重复元素。

题解:

// 保存所有子集的结果List<List<Integer>> res = new ArrayList<>();// 保存当前子集LinkedList<Integer> list = new LinkedList<>();// 记录数组中的元素是否被使用过boolean[] used;/*** 主方法,返回所有子集* @param nums 输入的数组* @return 所有不重复的子集*/public List<List<Integer>> subsetsWithDup(int[] nums) {// 初始化 used 数组used = new boolean[nums.length];// 对数组进行排序,以便处理重复元素Arrays.sort(nums);// 调用回溯函数backtracking(nums, 0, used);return res;}/*** 回溯方法,生成子集* @param nums 输入的数组* @param startIndex 回溯的起始索引* @param used 元素使用情况的记录*/public void backtracking(int[] nums, int startIndex, boolean[] used) {// 将当前子集加入结果集res.add(new ArrayList<>(list));// 如果起始索引等于数组长度,结束回溯if (startIndex == nums.length) {return;}// 遍历数组中的每一个元素for (int i = startIndex; i < nums.length; i++) {// 跳过重复元素,避免生成重复子集if (i > 0 && nums[i - 1] == nums[i] && !used[i - 1]) {continue;}// 添加当前元素到子集中list.add(nums[i]);// 标记当前元素为使用过used[i] = true;// 递归调用回溯函数,继续生成子集backtracking(nums, i + 1, used);// 回溯,撤销上一步操作used[i] = false;list.removeLast();}}

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

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

相关文章

Protobuf详解及入门指南

Protobuf详解及入门指南 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在分布式系统和跨平台通信中&#xff0c;高效、轻量的序列化协议尤为重要。Google的Pro…

PyMuPDF 操作手册 - 01 从PDF中提取文本

文章目录 一、打开文件二、从 PDF 中提取文本2.1 文本基础操作2.2 文本进阶操作2.2.1 从任何文档中提取文本2.2.2 如何将文本提取为 Markdown2.2.3 如何从页面中提取键值对2.2.4 如何从矩形中提取文本2.2.5 如何以自然阅读顺序提取文本2.2.6 如何从文档中提取表格内容2.2.6.1 提…

MSPM0G3507——定时器简介和功能

分为两种定时器&#xff1a;通用定时器&#xff08;TIMG&#xff09;和高级控制定时器&#xff08;TIMA&#xff09; 在官方手册中可能还出现TIMX&#xff0c;这里TIMX指的是两者通用的功能。 TIMG概述: TIMG模块由16位和32位自动重新加载计数器组成&#xff0c;由可编程预分…

Python 开发者必看,用Flet库打造你的第一个Web应用

大家好&#xff0c;桌面应用程序开发一直是一个热门话题。在python中&#xff0c;使用Tkinter和wxPython虽然功能强大&#xff0c;但它们在现代UI设计和交互体验上显得有些力不从心。而Flet&#xff0c;作为一个新兴的Python库&#xff0c;以其现代化的设计理念和简洁的开发方式…

小程序wx.uploadFile异步问题

问题&#xff1a;小程序上传文件后我需要后端返回的一个值&#xff0c;但这个值总是在最后面导致需要这个值的方法总是报错&#xff0c;打印测试后发现这它是异步的。但直接使用 await来等待也不行。 uploadImg.wxml <view class"upload-wrap"><view clas…

【自撰写】【国际象棋入门】第4课 局面分析初步

第4课 局面分析初步 一、国际象棋的棋局阶段划分 随着对弈的进行&#xff0c;国际象棋棋局可以划分为3个阶段&#xff0c;分别是开局阶段、中局阶段和残局阶段。简单说来&#xff0c;开局阶段主要完成子力的出动和布局&#xff1b;中局阶段涉及到更多的子力协同配合和子力兑换…

镭速是如何做到传输中快速校验大文件的

在信息泛滥的当下&#xff0c;文件传输系统的效率与安全性成为企业和个人用户高度关注的焦点。传统上&#xff0c;文件传输依赖于如MD5或XXHash等单一的完整性校验机制。 然而&#xff0c;在多变的工作环境中&#xff0c;这些传统方法显得不够灵活。镭速&#xff0c;作为大文件…

PostgreSQL源码分析——创建分区表

分区表&#xff0c;可以认为是逻辑上一张表&#xff0c;但实际上是将逻辑上的一张表&#xff0c;分割为了多个物理表&#xff0c;每个物理表是逻辑表中的一部分&#xff0c;组合起来就是一张表。所以在实现分区表时&#xff0c;实际上是创建了多张物理表&#xff0c;但是逻辑上…

【神经网络】深度神经网络

深度神经网络&#xff08;Deep Neural Network&#xff0c;简称DNN&#xff09;是一种模仿人脑神经网络结构和工作原理的机器学习模型。它通过层级化的特征学习和权重调节&#xff0c;能够实现复杂任务的高性能解决方案。深度神经网络由多个神经元层组成&#xff0c;每个神经元…

【尚庭公寓SpringBoot + Vue 项目实战】后台用户信息管理(十七)

【尚庭公寓SpringBoot Vue 项目实战】后台用户信息管理&#xff08;十七&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】后台用户信息管理&#xff08;十七&#xff09;1、业务说明2、逻辑模型介绍3、接口开发3.1、根据条件分页查询后台用户列表3.2、根据ID查询后…

【MySQL】复合查询和内外连接

文章目录 MySQL复合查询和内外连接1. 复合查询1.1 多表查询1.2 自连接1.3 子查询单行子查询多行子查询多列子查询from中使用子查询合并查询 2. 内外连接1. INNER JOIN2. LEFT JOIN3. RIGHT JOIN4. FULL JOIN5. CROSS JOIN MySQL复合查询和内外连接 1. 复合查询 1.1 多表查询 …

grafana连接influxdb2.x做数据大盘

连接influxdb 展示数据 新建仪表盘 选择存储库 设置展示

python字典转json

在Python中&#xff0c;你可以使用内置的json模块来轻松地将字典转换为JSON格式的字符串。下面是一个简单的示例&#xff1a; import json# 创建一个字典 data_dict {"name": "John Doe","age": 30,"city": "New York" }#…

Handler机制

目录 一、简介二、相关概念解释2.1 Message&#xff08;消息&#xff09;2.2 Handler&#xff08;处理器&#xff09;2.2.1 Handler的构造方法2.2.2 Handler sendMessage&#xff08;&#xff09;相关的方法2.2.3 Handler dispatchMessage&#xff08;&#xff09;方法 2.3 Mes…

NSSCTF-Web题目9

目录 [SWPUCTF 2021 新生赛]sql 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]xff 1、题目 2、知识点 3、思路 [FSCTF 2023]源码&#xff01;启动! 1、题目 2、知识点 3、思路 [SWPUCTF 2021 新生赛]sql 1、题目 2、知识点 SQL注入&#xff0c;空格、注释符等…

vite 和webpack 的区别

1. 开发服务器启动速度 Vite: Vite 通过利用现代浏览器对 ES 模块的原生支持来提供快速的开发服务器启动。它在开发模式下不需要打包&#xff0c;而是直接提供源代码&#xff0c;这使得启动速度非常快。 Webpack: Webpack 在开发模式下需要构建整个应用&#xff0c;这通常需要…

京东和天猫各渠道区别是什么?你了解吗?如何快速了解两个平台渠道推广

1.快车/直通车区别: 京东:不能投竞品词,能投定向商品选竞品,因为京东是卖平台流量和商品(自营(主收入)),不可以投竞品词是为了保护自己店铺的品牌流量; 天猫:只卖平台流量,不卖商品,所以允许竞品词投放; 2.竞品人群圈选: 因为数坊是自身品牌数据分析平台,所…

【Python教程】如何压缩PDF减小文件大小?

压缩 PDF 文件能有效减小文件大小并提高文件传输的效率&#xff0c;同时还能节省计算机存储空间。除了使用一些专业工具对PDF文件进行压缩&#xff0c;我们还可以通过 Python 来执行该操作&#xff0c;实现自动化、批量处理PDF文件。 本文将分享一个简单有效的使用 Python 压缩…

基于Python引擎的PP-OCR模型库推理

基于Python引擎的PP-OCR模型库推理 1. 文本检测模型推理 # 下载超轻量中文检测模型&#xff1a; wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar tar xf ch_PP-OCRv3_det_infer.tar python3 tools/infer/predict_det.py --image_dir"…

基于EXCEL数据表格创建省份专题地图

1 数据源 随着西藏于5月1日发布2022年一季度经济运行情况&#xff0c;31省份一季度GDP数据已全部出炉。 总量方面&#xff0c;粤苏鲁稳居前三&#xff1b;增速方面&#xff0c;23省份高于“全国线”&#xff0c;新疆表现最佳&#xff0c;增速达到7.0%。 表格表现数据不够直观…