剑指 Offer 67. 把字符串转换成整数及复制带随机指针的链表

news2024/12/24 11:37:02

文章目录

  • 一、剑指 Offer 67. 把字符串转换成整数
  • 二、Leetcode 138. 复制带随机指针的链表


一、剑指 Offer 67. 把字符串转换成整数

题目是这样的
在这里插入图片描述

字符串转换为整数,是连续的数字字符转换,如果数字字符不连续,只转换最前面连续的那部分
其实这道题是这样的,如果一开始字符串就不是正负号或者数字字符或者空格字符,那么就返回0
如果一开始为空格,则将空格丢弃,直到不是空格字符为止,然后对其第一个非空字符判断 有三种情况
情况一:第一个非空字符既不是正负号,也不是数字字符,直接返回0.
情况二:第一个非空格字符为正负号字符,将其第一个非空字符的下标保存,然后再判断非空字符的下一个字符,如果这个字符不存在或者这个字符不是数字字符,直接返回0
情况三;第一个非空字符为数字字符,那么直接将其转换为整数,之后再转换下一个字符,看是否满足转换条件
在这里插入图片描述

int strToInt(char* str) {
    if (*str == '\0')
    {
        return 0;
    }

    int len = strlen(str);
    int i = 0;
    long long int number = 0;/*用于返回数据*/

    while (str[i] == ' ')
    {
        i++;
    }

    int j = i;//将第第一个非空字符的下标保存下来(主要是正负号比较)

    //第一种情况
    if (str[i] != '-' && str[i] != '+' && (str[i] < '0' || str[i]>'9'))//当第一个非空字符既不是数字字符也不是正负号,就是返回0
    {
        return 0;
    }

    //第二种情况,第一个非空格字符为正负号
    else if (str[j] == '+' || str[j] == '-')
    {
        if (i + 1 >= len)return 0;//第一个非空字符的下一个字符不存在直接返回0

        else if (i + 1 < len && (str[i + 1] < '0' || str[i + 1]>'9')) //下一个字符存在,但是不是数字也直接返回0
        {
            return 0;
        }

        //都不是那么第二个非空字符就是'0'~'9'之间的字符
        else {

            i++;//由于第一个非空字符为正负号,那么就要将第二个非空字符转换为数字,
            //所以i自增,让i指向第二个非空格字符

            while (i < len && str[i] >= '0' && str[i] <= '9')
            {
                
                number = number * 10 + (str[i] - '0'); //将数字字符转换成整数
                
                //第一个非空格字符为负号,表明转换成的整数是负数
                if (str[j] == '-')
                {
                    //每转换一位字符都要判断整数是否越界
                    //若是当前字符转换完成时已经发生整数越界,比32为机器下最小值还小,那么后续字符不必再转换,直接返回32位机器下的最小存储值
                    if (-number <= -2147483648)
                    {
                        return -2147483648;
                    }
                }

                //第一个非空字符为正号
                //判断是否超过32为机器下整数类型最大值
                if (number > 2147483647)
                {
                    return 2147483647;
                }

                i++;//最后没有返回在将其后面字符转换
            }

            //最后如果非空字符之后连续数字都转换完了,还达不到返回条件,此时再进行返回,但是还是要先判断转换而来的是整数还是负数
            if (str[j] == '-')
            {
                number = -number;
            }
            return number;
        }
    }

   // 最后就是,第一个非空字符就是数字字符
    else  //就是(str[j] >= '0' && str[j] <= '9')
    {

        while (i < len && str[i] >= '0' && str[i] <= '9')
        {
            number = number * 10 + (str[i] - '0');

            if (number >= 2147483647)
            {
                return 2147483647;
            }
            i++;
        }

        return number;
    }
   
}

二、Leetcode 138. 复制带随机指针的链表

在这里插入图片描述

最主要的思想就是开一个节点,插在原链表节点后面,且值为原节点的值,链表每个节点后面都插入一个节点,其实就是将原链表节点的值拷贝给新节点
在这里插入图片描述

struct Node* copyRandomList(struct Node* head) {
	struct Node*cur = head;
   
    //这个拷贝节点其实就相当于链表插入一个节点
    //插入操作
    while(cur)
    {
        struct Node*copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;
        struct Node*next = cur->next;
        copy->next = next;
        cur->next = copy;
        cur = next;
    }
    //链表从头开始拷贝random指针
    cur = head;
    while(cur)
    {
        struct Node*copy = cur->next;
        //如果原节点的random指针指向空,那么拷贝节点的random指针也指向空
        if(cur->random == NULL)
        {
            copy->random = NULL;
        }

        //原链表节点的random指针不为空,那么拷贝节点的random指针其原链表节点random->next指针,因为random指针可以找到其节点的随机地址,而这个随机地址的拷贝由随机地址的next指向,所以就是random->next;因为这拷贝要将值和random都拷贝过去
        else
        {
            copy->random = cur->random->next;
            
        }
        cur = copy->next;
    }


    //拷贝完成后,再将原链表恢复,然后将拷贝的各个节点链接起来
    //这样就达成目标
    //时间复杂度O(n)
    //空间复杂度O(1)
    struct Node*copyHead = NULL;
    struct Node*copyTail = NULL;
    cur = head;
    while(cur)
    {
        struct Node*copy = cur->next;
        struct Node*next = copy->next;
        if(copyHead == NULL)
        {
            copyHead = copyTail = copy;

        }

        else
        {
         copyTail->next = copy;
         copyTail = copyTail->next;
        }
        cur->next = next;
        cur = next;
    }

    return copyHead;
}

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

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

相关文章

Axios的介绍与使用

Axios的介绍 get请求 Axios配置对象 创建实例发送请求 取消请求 Axios的介绍 目前前端最流行的 ajax 请求库 、react/vue 官方都推荐使用 axios 发 ajax 请求 特点&#xff1a; 基于 xhr promise 的异步 ajax 请求库浏览器端/node 端都可以使用支持请求&#xff0f;…

20.Java序列化

Java序列化 一、序列化和反序列化 序列化&#xff1a;指堆内存中的java对象数据&#xff0c;通过某种方式把对存储到磁盘文件中&#xff0c;或者传递给其他网络节点&#xff08;网络传输&#xff09;。这个过程称为序列化&#xff0c;通常是指将数据结构或对象转化成二进制的…

IPC行业信息汇总

IPC&#xff1a;“网络摄像机”&#xff0c;是IP Camera的简称。它是在前一代模拟摄像机的基础上&#xff0c;集成了编码模块后的摄像机。它和模拟摄像机的区别&#xff0c;就是在新增的“编码模块”上。 模拟摄像机&#xff0c;顾名思义&#xff0c;输出的是模拟视频信号。模拟…

大数据系列——Spark理论

概述 Apache Spark&#xff0c;全称伯克利数据分析栈&#xff0c;是一个开源的基于内存的通用分布式计算引擎&#xff0c;内部集成大量的通用算法&#xff0c;包括通用计算、机器学习、图计算等&#xff0c;用于处理大数据应用。 主要由下面几个核心构件组成&#xff0c;具体包…

C++、STL标准模板库和泛型编程 ——适配器、补充(侯捷)

C、STL标准模板库和泛型编程 ——适配器 &#xff08;侯捷&#xff09;--- 持续更新 适配器&#xff08;Adapters&#xff09;容器适配器&#xff08;Container Adapters&#xff09;仿函数适配器&#xff08;Functor Adapters&#xff09;bind2nd&#xff08;绑定第二实参&…

Tomcat源码:Pipeline与Valve

参考资料&#xff1a; 《Tomcat组成与工作原理》 《Tomcat - Container的管道机制&#xff1a;责任链模式》 《Tomcat源码解析系列 Pipeline 与 Valve》 前文&#xff1a; 《Tomcat源码&#xff1a;启动类Bootstrap与Catalina的加载》 《Tomcat源码&#xff1a;容器的生命…

Mybatis源码01-Executor

前言 为了方便公司业务排查问题&#xff0c;要求打印执行的sql&#xff0c;以及执行时间。编写了一个Mybatis的拦截器&#xff0c;此前从未看过mybatis的源码&#xff0c;在调试的过程中不断阅读源码&#xff0c;后边想更深刻了解一下&#xff0c;看了鲁班大叔的视频&#xff…

OSCP-Nickel(爆破pdf、本地http提权)

目录 扫描 HTTP 提权 扫描 FileZilla不接受匿名FTP登录。 端口21上的SSH和3389上的RDP很少是初始入口点,但是如果遇到一些凭据,可以记住这一点。 HTTP 打开Web浏览器并导航到端口8089和3333,用于的HTTP服务器。端口8089似乎是某种类型的开发环境。 单击一个按钮重定向到…

boot-admin整合Quartz实现动态管理定时任务

淄博烧烤爆红出了圈&#xff0c;当你坐在八大局的烧烤摊&#xff0c;面前是火炉、烤串、小饼和蘸料&#xff0c;音乐响起&#xff0c;啤酒倒满&#xff0c;烧烤灵魂的party即将开场的时候&#xff0c;你系统中的Scheduler&#xff08;调试器&#xff09;&#xff0c;也自动根据…

在函数中使用变量

shell脚本编程系列 向函数传递参数 函数可以使用标准的位置变量来表示在命令行中传给函数的任何参数。其中函数名保存在$0变量中&#xff0c;函数参数则依次保存在$1、$2等变量当中&#xff0c;也可以使用特殊变量$#来确定参数的个数 在脚本中调用函数时&#xff0c;必须将参…

day3 TCP/IP协议与五层体系结构

TCP / IP 四层体系结构 TCP / IP工作流程&#xff1a; 现在互联网使用的 TCP/IP 体系结构已经发生了演变&#xff0c;即某些应用程序可以直接使用 IP 层&#xff0c;或甚至直接使用最下面的网络接口层。 沙漏型展示&#xff1a; 五层体系结构 各层的主要功能 应用层&#xff1…

C++ Primer阅读笔记--语句的使用

① 空语句 最简单的语句是空语句&#xff0c;其只含有一个单独的分号&#xff1b; ② switch语句 case 关键字和它对应的值一起被称为 case 标签&#xff0c;case 标签必须是整型常量表达式&#xff1b; char ch getVal(); int iVal 42; switch(ch){case 3.14: // 错误&#…

ZmosHarmony buildroot移植与使用

前言 移植过程 1、添加编译选项编译buildroot。 2、开机启动时设置 LD库的环境变量与PATH路径。 是什么原因需要这样操作&#xff1f; 主要使用busybox&#xff0c;使用buildroot的瑞士军dao。 使用busybox 为buildroot下的使用 第一次启动时设置 由于是在vendor分区因此 …

01 openEuler虚拟化-KVM虚拟化简介

文章目录 01 openEuler虚拟化-KVM虚拟化简介1.1 简介1.2 虚拟化架构1.3 虚拟化组件1.4 虚拟化特点1.5 虚拟化优势1.6 openEuler虚拟化 01 openEuler虚拟化-KVM虚拟化简介 1.1 简介 在计算机技术中&#xff0c;虚拟化是一种资源管理技术&#xff0c;它将计算机的各种实体资源&…

ActiveMQ 反序列化漏洞 (CVE-2015-5254)漏洞复现

当前漏洞环境部署在vulhub,当前验证环境为vulhub靶场&#xff08;所有实验均为虚拟环境&#xff09; 实验环境&#xff1a;攻击机----kali 靶机&#xff1a;centos7 需要的jar包&#xff1a;jmet-0.1.0-all.jar 1、启动docker&#xff0c;进入vulhub&#xff08;靶机&#xff0…

centos主机测试io极限

这里使用fio工具来测试磁盘的io 1.安装fio命令 yum -y install fio 2.在需要测试的磁盘所挂载的目录下创建一个测试目录 由于我就只有一个磁盘&#xff0c;/目录也挂载在这个磁盘上&#xff0c;所以就直接在tmp目录里创建 mkdir /tmp/cs 3.创建一个名为 test.fio 的文件&a…

中级软件设计师备考---信息系统安全

目录 安全属性对称加密技术非对称加密技术信息摘要和数字签名数字信封和PGP各个网络层次的安全保障网络威胁与攻击防火墙技术 安全属性 保密性&#xff1a;最小授权原则、防暴露、信息加密、物理保密 完整性&#xff1a;安全协议、校验码、密码校验、数字签名、公证 可用性&a…

【 Spring 事务传播机制 】

文章目录 一、概念二、为什么需要事务传播机制&#xff1f;三、事务传播机制有哪些&#xff1f;四、Spring 事务传播机制使⽤和各种场景演示4.1 ⽀持当前事务&#xff08;REQUIRED&#xff09;4.2 不⽀持当前事务&#xff08;REQUIRES_NEW&#xff09;4.3 NESTED 嵌套事务4.4 嵌…

软考软件设计师 软件工程笔记

软件工程 CMM&#xff08;能力成熟度模型&#xff09;CMMI&#xff08;能力成熟度模型集成&#xff09;瀑布模型V模型&#xff08;质量保证&#xff09;增量模型演化模型&#xff08;迭代更新&#xff09;原型模型螺旋模型&#xff08;风险分析&#xff09;喷泉模型统一过程&am…

大数据编程实验二:熟悉常用的HDFS操作

实验目的 1、理解HDFS在Hadoop体系结构中的角色 2、熟悉使用HDFS操作常用的Shell命令 3、熟悉HDFS操作常用的Java API 实验平台 1、操作系统&#xff1a;Windows 2、Hadoop版本&#xff1a;3.1.3 3、JDK版本&#xff1a;1.84、Java IDE&#xff1a;IDEA 实验步骤 前期&#x…