【代码随想录day24】【C++复健】93.复原IP地址; 78.子集 ;90.子集II

今天写代码的时候整体状态其实就不太好,整个人晕晕的,好多时候写出来的代码也是多少带点愚蠢。

93.复原IP地址

看卡哥说“大家做完 分割回文串 之后,本题就容易很多了”还以为是秒杀题呢,结果直接被卡住。怎么说呢,做完了分割回文串对这道题来说也只能大致想明白一个思路,但是具体实现上细节其实真的还蛮多的。

1 又忘记了分治思想

这个题我的代码再次把判断合法性和剪切的代码写到了一起,但这样想问题其实是会把问题复杂化的,用一个函数同时实现两个功能和用两个函数分别实现各自的功能并且组合起来,明显是后者要简单很多的。

2 循环终止条件没写对

写了个i < min(s.size(), 3);。怎么说呢,前面还知道是从startindex处开始的,后面就完全忘了这个事写了个3上去,那肯定就错了啊。

3 在修正完之后自信满满的改成了i < min(startindex + 3, s.size());,然而,又报错了,原因更是震碎三观,直接看GPT:

size()函数返回的竟然是一个叫size_t的无符号整型!

有一种这么多个题白写了的感觉:每当我写下一行int n  = s.size();的时候,都发生了一次隐式转换,而我完全不知道,我只在乎我自己。

4 在排除0开头的时候,在循环外写了如下的代码:
if(s[startindex] == 0){
           return;
       }

这个代码会把每次遇到0的情况直接返回,不做任何输出。但这个逻辑是错的,因为当是一个单独的0的时候,其实是合法的!

除此之外,这还是一个char和int的判断,根本不可能相等。

作为改进,直接写成这样即可:

if (tocheck.size() > 1 && tocheck[0] == '0') break;

也就是直接把所有条件都列出来然后终止当前层的循环。

5 边界条件问题

一开始没有想的很清楚,有几个很容易混淆的点:

        ① for循环应该从i = startindex开始,还是i = startindex + 1开始?

        自己想的是至少有一个元素所以从startindex+1开始,但如果是左闭右闭区间的话,右便捷其实取startindex就已经有一个元素在里面了,想岔了。

        ②substr是substr(startindex, i - startindex);,还是(startindex, i - startindex + 1);?

        这个因为右边界是长度的原因,如果是左边的情况,在起始位置长度是0,那么其实代表空字符串,如果想要起始就有元素应该是+1才对的。

6 C++字符串转int又没长记性:

不是int(s),而是stoi(s)

最后修修改改写出了如下代码:
 

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        int startindex = 0;
        int time = 0;
        vector<string> path;
        vector<string> result;
        split(s, startindex, time, path, result);
        return result;
    }
    void split(string s, int startindex, int time, vector<string>& path, vector<string>& result) {
        if(time == 4 && startindex == s.size()){
            string ip;
            for(int i = 0; i < path.size(); i++){
                ip += path[i];
                if(i != path.size()-1){
                    ip += ".";
                }
            }
            result.push_back(ip);
        }
        else if(startindex == s.size() || time >= 4){
            return;
        }
        // if(s[startindex] == '0'){
        //     return;
        // }
        for(int i = startindex; i < min(startindex + 3, int(s.size())); i++){
            string tocheck = s.substr(startindex, i - startindex + 1);
            if (tocheck.size() > 1 && tocheck[0] == '0') break;
            if(stoi(tocheck) > 255){
                break;
            }
            path.push_back(tocheck);
            split(s, i+1, time+1, path, result);
            path.pop_back();
        }
    }
};

但说一千道一万,其实大部分的麻烦都是试图将两个函数二合一所带来的问题。以后遇到一个比较麻烦的题,应该最先想到的是能不能分成几个不同的块去处理。

78.子集

本题整体没遇到什么问题,就是一个要注意的点:

空集也算子集,要添加进去即可。

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> result;
        vector<int> path;
        result.push_back(path);
        int startindex = 0;
        split(nums, startindex, result, path);
        return result;
    }
    void split(vector<int>& nums, int startindex, vector<vector<int>>& result, vector<int>& path) {
        if(startindex == nums.size()){
            return;
        }
        for(int i = startindex; i < nums.size(); i++){
            path.push_back(nums[i]);
            result.push_back(path);
            split(nums, i + 1, result, path);
            path.pop_back();
        }
    }
};

90.子集II

本题一整个就是对之前代码的一个默写,索性我的记忆力还是不错的,但还是有一个地方默写错了:if (i > startindex && nums[i] == nums[i - 1]) continue;把if写成while了,结果就是发生无限循环。我还在纳闷哪里出问题了呢,属实犯蠢。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue:条件渲染 列表渲染

Vue&#xff1a;条件渲染 & 列表渲染 条件渲染v-showv-if 列表渲染v-for数组对象 条件渲染 Vue允许依据一定的条件&#xff0c;通过表达式的布尔值&#xff0c;来决定是否渲染某些元素&#xff0c;其依赖于v-show和v-if两条指令。 v-show v-show可以依据表达式的布尔值&…

计算机的错误计算(一百四十八)

摘要 本节探讨 MATLAB 中 附近数的正割函数与 附近数的余割函数的计算精度问题。 例1. 已知 计算 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 0.4105556037464873e9、0.3670813182326778e13、-0.2549029285657875e8 与 -0.1248777628817462e12&am…

input file检验成功之后才可以点击

input file检验成功之后才可以点击 需求 在上传发票前需要先填写发票号&#xff0c;然后点击选择文件直接完成上传功能 实现思路 在没有输入发票号之前&#xff0c;file按钮不可用不能点击&#xff0c;输入之后&#xff0c;按钮可用&#xff0c;点击之后选择文件&#xff…

理解鸿蒙app 开发中的 context

是什么 Context是应用中对象的上下文&#xff0c;其提供了应用的一些基础信息&#xff0c;例如resourceManager&#xff08;资源管理&#xff09;、applicationInfo&#xff08;当前应用信息&#xff09;、dir&#xff08;应用文件路径&#xff09;、area&#xff08;文件分区…

算法每日练 -- 双指针篇(持续更新中)

介绍&#xff1a; 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff08;左右指针&#xff09;&#xff0c;一种是快慢指针&#xff08;前后指针&#xff09;。需要注意这里的双指针不是 int* 之类的类型指针&#xff0c;而是使用数组下标模拟地址来进行遍历的方式。 …

Python学习从0到1 day26 第三阶段 Spark ①

要学会 剥落旧痂 然后 循此新生 —— 24.11.8 一、Spark是什么 定义&#xff1a; Apache Spark 是用于大规模数据处理的统一分析引擎 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算TB、PB乃至EB级别的海量数据…

jenkins使用slave节点进行node打包报错问题处理

jenkins使用slave打包报错 Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to 21.136 解决方法&#xff1a; 重启从节点 选择断开连接再重新连

python登录功能实现

一.用python实现基本的登录功能 #-----------------1.基本登录功能------------------- nameinput("qq账号&#xff1a;") if name"jc":passwdinput("密码&#xff1a;")if passwd"123456":print("登录成功")else:print(&q…

三菱MR-J4伺服绝对位置检测系统

发生[AL.25 绝对位置丢失]或[AL.E3 绝对位置计数器警告]时&#xff0c;必须再次进行原点设定。否则可能会因此发生预料之外的动作。 概要 常规运行时&#xff0c;编码器由检测1转内位置的编码器和检测转数的旋转累计计数器构成。 绝对位置检测系统与伺服系统控制器电源…

mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误

1. 出现报错 2. 获取openssl位置 brew info openssl 3. 配置环境变量&#xff08;我的是在~/.bash.profile&#xff09; export LDFLAGS"-L/opt/homebrew/Cellar/openssl3/3.4.0/lib" export CPPFLAGS"-I/opt/homebrew/Cellar/openssl3/…

OceanBase详解及如何通过MySQL的lib库进行连接

OceanBase详解及如何通过MySQL的lib库进行连接 一、引言二、OceanBase概述1. 起源与发展2. 核心技术特点3. 应用场景三、OceanBase架构解析1. 系统架构2. 存储引擎3. 分布式架构四、如何使用MySQL的lib库连接OceanBase1. 前提条件2. 安装MySQL Connector/C3. 编写连接代码4. 编…

aspose如何获取PPT放映页“切换”的“持续时间”值

aspose如何获取PPT放映页“切换”的“持续时间”值 项目场景问题描述问题1&#xff1a;从官方文档和资料查阅发现并没有对切换的持续时间进行处理的方法问题2&#xff1a;aspose的依赖包中&#xff0c;所有的关键对象都进行了混淆处理 解决方案1、找到ppt切换的持续时间对应的混…

SpringBoot开发——SpringBoot3.3 中实现多端口监听

文章目录 1、项目环境与依赖配置2、配置多端口监听3、编写配置类实现多端口监听4、为每个端口创建独立的配置类4.1 8081 端口配置类4.2 8082 端口配置类 5、控制器类定义5.1 8080 端口的控制器&#xff08;保持原有配置&#xff09;5.2 8081 端口的控制器5.3 8082 端口的控制器…

大数据湖项目建设方案(100页WORD)

文档介绍&#xff1a; 随着信息技术的飞速发展&#xff0c;数据量呈现出爆炸性增长的趋势。企业、政府机构及科研单位在运营过程中积累了大量的数据资源&#xff0c;这些数据中蕴含着巨大的价值&#xff0c;但如何高效地存储、处理和分析这些数据&#xff0c;成为了一个亟待解…

【SpringBoot】SpringCloud一些常用依赖

SpringChoudAlibaba springcloud版本对应关系 可以按照hm这样写 ----以下是我自己使用过的&#xff0c;比较乱 parent <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><versi…

Webserver(5.3)线程池实现

目录 线程池locker.hthreadpool.h 线程池 相比于动态地创建子线程&#xff0c;选择一个已经存在的子线程的代价显然要小得多。至于主线程选择哪个子线程来为新任务服务&#xff0c;有多种方式&#xff1a; 主线程使用某种算法来主动选择子线程。最简单、最常用的算法是随机算…

解决:使用EasyExcel导入Excel模板时出现数据导入不进去的问题

解决&#xff1a;使用EasyExcel导入Excel模板时出现数据导入不进去的问题 在Java中&#xff0c;当我们用EasyExcel导入Excel时&#xff0c;可能会出现数据导入不进去的问题。例如&#xff1a; 这种异常等。 问题原因1&#xff1a;这个1代表从第几行开始&#xff0c;你的exce…

可视化建模与UML《类图实验报告》

史铁生&#xff1a; 余华和莫言扛着我上火车&#xff0c; 推着走打雪仗&#xff0c; 还带我偷西瓜&#xff0c; 被人发现后他们拔腿就跑&#xff0c; 却忘了我还在西瓜地里。 一、实验目的&#xff1a; 1、熟悉类图的构件事物。 2、熟悉类之间的泛化、依赖、聚合和组合关系…

python(自用查看版)

目录 1.注意事项 1.1 python的除法不是整除&#xff0c;得到的是浮点数 1.2算术符号基于数学的算术优先级。具体可自行查看。 1.3注释 1.4缩进 1.5换行 1.6常见关键字 1.7续行符 1.8报错 1.9赋值 1.10比较运算符 2.常量和表达式 3.变量 4.数据类型 4.1整型int …

TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境

TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境 博客地址&#xff1a;TMDOG的博客 作者自述&#xff1a; 最近忙着整理自己的项目代码&#xff0c;终于有时间更新一下博客。这次的内容是关于如何在Gin框架下集成支付宝的支付沙箱环境&#xff0c;具体包括如何初始化支付…