(其他) 剑指 Offer 67. 把字符串转换成整数 ——【Leetcode每日一题】

news2024/10/10 14:24:32

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

难度:中等

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [231,2311]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: “42”
输出: 42

示例 2:

输入: " -42"
输出: -42
解释: 第一个非空白字符为 ‘-’, 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: “4193 with words”
输出: 4193
解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。

示例 4:

输入: “words and 987”
输出: 0
解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。
因此无法执行有效的转换。

示例 5:

输入: “-91283472332”
输出: -2147483648
解释: 数字 “-91283472332” 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。

注意:本题与 8. 字符串转换整数 (atoi) 相同。

💡思路:

根据题意,有以下四种字符需要考虑

  1. 首部空格: 删除之即可;
  2. 符号位: 三种情况,即 '+' , '-''+-';新建一个变量 flag 保存符号位,返回前判断正负即可。
  3. 非数字字符: 遇到首个非数字的字符时,应立即跳出循环;
  4. 数字字符:
    • 字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即:str[i] - '0'
    • 数字拼接: 若从左向右遍历数字,设当前位字符为 str[i] ,当前位数字为 tmp ,数字结果为 ans ,则数字拼接公式为:ans = ans * 10 + tmp

注意:题目要求返回的数值范围应在 [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31} - 1] [231,2311],因此需要考虑数字越界问题。而由于题目指出 环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终保持 ans 在 int 类型的取值范围内。

  • 如果为正 ,需要满足 (INT_MAX - tmp) / 10 >= ans ,则一定不会越过 2 31 − 1 2^{31} - 1 2311
  • 如果为负 ,需要满足 (INT_MIN + tmp) / 10 <= ans,则一定不会越过 − 2 31 -2^{31} 231

🍁代码:(C++、Java)

C++

class Solution {
public:
    int strToInt(string str) {
        if(str.empty() || str.size() == 0) return 0;
        int ans = 0, flag = 0;
        for(int i = 0; i < str.size(); i++){
            if(str[i] == ' ' && flag == 0) continue; //去除开头空格字符
            else if((str[i] == '-' || str[i] == '+') && flag == 0){ //第一个非空字符正负号
                flag = str[i] == '-' ? -1 : 1;
            }else if(str[i] < '0' || str[i] > '9'){
                break;
            }else{
                int tmp = str[i] - '0';
                flag = flag == 0 ? 1 : flag;
                if(flag == 1){
                    if((INT_MAX - tmp) / 10 >= ans) ans = ans * 10 + tmp;
                    else return INT_MAX;
                }else{
                    if(ans > 0) ans *= -1;
                    if((INT_MIN + tmp) / 10 <= ans) ans = ans * 10 - tmp;
                    else return INT_MIN;
                }
            }
        }
        return ans;
    }
};

Java

class Solution {
    public int strToInt(String str) {
        if(str == null || str.length() == 0) return 0;
        int ans = 0, flag = 0;
        for(int i = 0; i < str.length(); i++){
            if(str.charAt(i) == ' ' && flag == 0) continue; //去除开头空格字符
            else if((str.charAt(i) == '-' || str.charAt(i) == '+') && flag == 0){ //第一个非空字符正负号
                flag = str.charAt(i) == '-' ? -1 : 1;
            }else if(str.charAt(i) < '0' || str.charAt(i) > '9'){
                break;
            }else{
                int tmp = str.charAt(i) - '0';
                flag = flag == 0 ? 1 : flag;
                if(flag == 1){
                    if((Integer.MAX_VALUE - tmp) / 10 >= ans) ans = ans * 10 + tmp;
                    else return Integer.MAX_VALUE;
                }else{
                    if(ans > 0) ans *= -1;
                    if((Integer.MIN_VALUE + tmp) / 10 <= ans) ans = ans * 10 - tmp;
                    else return Integer.MIN_VALUE;
                }
            }
        }
        return ans;
    }
}

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 为字符串的长度。我们只需要依次处理所有的字符,处理每个字符需要的时间为 O ( 1 ) O(1) O(1)
  • 空间复杂度 O ( 1 ) O(1) O(1),只需要常数空间存储。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

C++学习笔记(堆栈、指针、命名空间、编译步骤)

C 1、堆和栈2、指针2.1、指针的本质2.2、指针的意义2.3、清空指针2.4、C类中的this 3、malloc and new4、命名空间4.1、创建命名空间4.2、使用命名空间 5、编译程序的四个步骤5.1、预处理5.2、编译5.3、汇编5.4、链接 1、堆和栈 堆&#xff08;heap&#xff09;和栈&#xff0…

领域驱动设计:DDD与微服务的关系

文章目录 基础概念软件架构模式的演进微服务设计和拆分的困境为什么 DDD 适合微服务&#xff1f;DDD 与微服务的关系 基础概念 DDD 虽然历史很久了&#xff0c;但它与微服务和中台设计的结合&#xff0c;却是一片很新的领域。早在 2003 年就诞生的 DDD&#xff0c;怎么来指导“…

基于spring boot+ vue开发的位置数据展现和分析平台源码 UWB源码

spring boot vue位置数据展现和分析平台源码 UWB室内外高精度定位系统源码 智慧工厂是现代工厂信息化发展的新阶段&#xff0c;基于UWB定位技术&#xff0c;融合位置物联网、GIS可视化等技术&#xff0c;实现对人员、物资精确管理。在重点区域设置电子围栏&#xff0c;无权限…

【Mysql】数据库第一讲(服务器数据库的安装和基础操作介绍)

数据库基础 &#x1f361;1.CentOs服务器数据库的安装&#x1f367;2.基础使用&#x1f368; 2.1 服务器&#xff0c;数据库&#xff0c;表关系&#x1f366;2.2使用案例&#xff1a; &#x1f967;3.数据库分类&#x1f9c1;4.存储引擎&#x1f370;4.Mysql库的操作&#x1f3…

YOLO目标检测——密集人群人头数据集+已标注yolo格式标签下载分享

实际项目应用&#xff1a;城市安防、交通管理、社会研究、商业应用、等多个领域数据集说明&#xff1a;YOLO密集人群人头目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片格式为jpg&#xff0c;共4300张图片。标注说明&#xff1a…

【web开发】6、Django(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Django是什么&#xff1f;二、使用步骤1.安装Django2.创建项目3.创建app4.快速上手 数据库操作1.安装第三方模块2.自己创建数据库3.DJango链接数据库4.DJango操…

ubuntu下查看文件(夹)大小的命令

记录下自己常用的查看文件夹和文件大小的命令。 1、查看当前所处的文件夹的整个大小&#xff08;只看当前文件夹大小&#xff09; du -sh2、查看当前文件夹中各个文件的大小 用-l或者-lh都行&#xff0c;加个h会增加可读性&#xff0c;如果想看具体某个文件&#xff0c;在后…

wires hark抓包内容解析

1.Frame 22001&#xff1a;这是该数据包的序号&#xff0c;表示wires hark已经捕获并显示了22001个数据包&#xff1b; 2.225 bytes on wire (1800 bits)&#xff1a;该数据的原始大小、以字节和比特显示&#xff1b; 3.225 bytes captured (1800 bits)&#xff1a;wires har…

元宇宙Web3.0科普---MoneyKing链游平台新格局介绍

众所周知&#xff0c;当前元宇宙“行业化”概念爆发后&#xff0c;当前社会甚至全世界再次步入一个全新的世界格局分水岭&#xff1b;随之而来的&#xff0c;包括了元宇宙具像化落地的Web3.0概念。 如果有人不懂什么是元宇宙&#xff0c;不懂什么是Web3.0&#xff0c;小编用最…

多线程与高并发——并发编程(5)

文章目录 五、线程池1 什么是线程池2 JDK自带的构建线程池的方式2.1 FixedThreadPool2.2 SingleThreadExecutor2.3 CachedThreaPool2.4 ScheduleThreadPool2.5 WorkStealingPool3 ThreadPoolExecutor应用&源码剖析3.1 为什么要自定义线程池3.2 ThreadPoolExecutor应用3.3 T…

数据透视表如何让多个行标签并列显示?

数据透视表如何让多个行标签并列显示&#xff1f; “数据透视表工具 - 报表布局" 这里有三种格式&#xff1a;&#xff08;1&#xff09;以压缩形式显示&#xff1b;&#xff08;2&#xff09;以大纲&#xff1b;&#xff08;3&#xff09;以表格形式。 选择“以表格显…

轻量容器引擎Docker基础使用

轻量容器引擎Docker Docker是什么 Docker 是一个开源项目&#xff0c;诞生于 2013 年初&#xff0c;最初是 dotCloud 公司内部的一个业余项目。 它基于 Google 公司推出的 Go 语言实现&#xff0c;项目后来加入了 Linux 基金会&#xff0c;遵从了 Apache 2.0 协议&#xff0c;…

MySQL-DDL语句

MySQL-DDL语句 数据库操作语句增删数据库查看数据库列表创建数据库进入&#xff08;使用&#xff09;数据库/查看当前所在的数据库查看数据库的建库语句查看数据库的编码集和校验集删除数据库修改数据库的编码集查看数据库支持的编码集和校验集 数据库备份备份单个数据库恢复数…

基于spring boot+ vue+ mysql开发的UWB室内外定位系统源码

现代制造业厂区面积大、人员数量多、物资设备不断增加&#xff0c;随着工业信息化技术的发展&#xff0c;大型制造企业中对人员、车辆、物资的管理要求越来越细致。 高精度定位管理系统使用UWB室内定位技术&#xff0c;通过在厂区安装定位基站&#xff0c;为人员或设备佩戴定位…

djanjo安装-各版本对应表

djanjo安装-各版本对应表 1 各版本对应表 django详细版本与python版本对照表&#xff0c;尽量按照表中的版本对应安装 2 djanjo安装 pip install django2.2.* // 默认会安装:Django2.2的最新版本2.2.28和对应的sqlparse-0.4.4、pytz等包python -m django --version // 检测…

抖店的产品是怎么卖出去的?带你了解抖店的核心玩法,不需要直播

我是王路飞。 你认为抖店就是在抖音开直播&#xff0c;然后把产品吆喝着卖出去吗&#xff1f; 如果你是这样看待抖店的话&#xff0c;那只能说明你根本不了解抖音小店&#xff0c;也不了解抖音的带货模式。 今天就给你们讲一下抖店的产品都是怎么卖出去的。 带你了解抖店的…

【Terraform】Terraform自动创建云服务器脚本

Terraform 是由 HashiCorp 创建的开源“基础架构即代码”工具 &#xff08;IaC&#xff09; 使用HCL&#xff08;配置语言&#xff09;描述云平台基础设施&#xff08;这里教你使用低级基础设施&#xff1a;交换机、云服务器、VPC、带宽&#xff09; Terraform提供者&#xf…

SpringBoot原理-自动配置-方案

自动配置原理 在运行SpringBoot项目启动类&#xff08;SpringBootApplication标注启动类&#xff09;启动SpringBoot项目时&#xff0c;SpringBootApplication是一个混合注解&#xff0c;包括 SpringBootConfiguration&#xff08;&#xff09;标识该类是一个配置类&#xff0…

SpringMVC:从入门到精通,7篇系列篇带你全面掌握--四.5分钟搞定文件上传与下载

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringMVC的相关操作吧 需要添加的依赖 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</a…

vscode开发油猴插件环境配置指南

文章目录 一、环境配置1.1油猴插件开始编写代码1.2油猴插件配置1.2.1浏览器插件权限1.2.2插件自身权限 2. 油猴脚本API学习2.1 头文件2.2 油猴API 一、环境配置 1.1油猴插件开始编写代码 在vscode 中写入如下代码‘ // UserScript // name cds_test // namespace …