【LeetCode】剑指 Offer 67. 把字符串转换成整数 p318 -- Java Version

news2024/11/14 14:30:45

题目链接:https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/

1. 题目介绍(67. 把字符串转换成整数)

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

在这里插入图片描述

【测试用例】:
在这里插入图片描述

【相关题目】:

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

2. 题解

2.1 库函数

解题思路】:
在 Java 中常使用 Integer.parseInt() 以及 Integer.valueOf() 将一个字符串变量转化成一个整型变量,它俩的区别就在于:

  • Integer.parseInt(s) 是把字符串s解析成有符号的 int 基本类型;
  • Integer.valueOf(s) 是把字符串s解析成 Integer 对象类型,且在Integer 类中还有一个内部的缓存类 IntegerCache ,它默认缓存了[-128, 127]的Integer值. 如果使用的是Integer.valueOf(s),它就会去检查这个数字是否在 [-128, 127] 这个范围内,如果在这个范围内,则直接在 IntegerCache 中取值;如果不在,则新创建一个Integer对象,同时也是为什么Integer 用 “== ” 比较时127相等而128不相等的原因。

所以,一般情况下,如果我们只是需要一个 int 值,parseInt 是合适的,而且效率要高,用valueOf 就属于多此一举了,性能会下降,同样Integer, Long, Double, Float 都是一样的道理。
……
缺点:使用库函数转化字符串,要求字符串中只能为在类型范围内的正确数字才行,如果出现了空格、非0~9之间的其它字符均会报错。

  1. 数字越界
    在这里插入图片描述
  2. 字符串中存在空格
    在这里插入图片描述
  3. 字符串中非0~9之间的其它字符
    在这里插入图片描述

……
更多内容可参考:
[1] Integer.parseInt(s)与Integer.valueOf(s)的区别详解
[2] Integer.valueOf和Integer.parseInt区别
[3] [概念理解] Java中parseXXX和valueOf,toString的区别

class Solution {
    // Solution1: 库函数
    public int strToInt(String str) {
        String s = str.trim();
        // 将字符串转成整数
        // Integer.valueOf 返回值是 Integer 类型
        // Integer.parseInt 返回值是 int 类型
        int a = Integer.parseInt(s);
        int b = Integer.valueOf(s);  // 自动拆箱,相当于调用了Integer中的 intValue()方法
        
        // 将整数转换成字符串
        String s1 = String.valueOf(b);
        System.out.println(s1);
        return b;
    }
}

2.2 自定义 strToInt() 函数 – O(n) ⭐

时间复杂度 O(n),空间复杂度 O(n)
在这里插入图片描述

解题思路】:
题目不难,但有很多细节需要注意,如下所示:

  1. 首尾空格:首尾空格最好解决,直接使用库函数 trim() 即可删除首尾空格;
  2. 符号位:三种情况,即 ‘’+‘’ , ‘‘−’’ , ''无符号" ;定义一个变量 sign 用来表示符号位,返回前判断正负即可
  3. 非数字字符:遇到首个非数字的字符时,应立即返回,退出循环,忽略该数字及以后的所有字符;
  4. 数字越界:因为 int 型的数据范围是 [-231,231-1],即[-2,147,483,648, 2,147,483,647] ,所以我们定义了一个int最大值除以10的数字 limit,用低于 int 型数据长度一位的数据 res 与 limit 进行比较,判断是否越界,如果 res 与 limit 相等,那就再判断一下当前的字符 ch[i] 是否 > 7,如果大于 7,则说明此数字一定越界,根据符号位判断一下,返回最大/最小值即可。

……
实现策略】:

  1. 使用 trim() 方法去掉字符串的首尾空格,并将其转换成字符数组 array
  2. 根据字符数组 array 的长度判断是否属于空字符串 “ ”,如果是的话,则返回0;
  3. 定义 res 用来返回最终结果,定义 sign 用来记录符号位,定义 i 用来作为数字位的索引;
  4. 定义 limit 用来在遍历中判断 res 是否越界,其值为 Integer.MAX_VALUE / 10
  5. 判断首位是否存在符号位,‘-’ 用 -1 表示,如果无符号位,则默认位正,并把 数据位索引 idx 移动到首位;
  6. 循环遍历字符数组 array,判断其中的字符是否为 非数字字符,如果是,则直接跳出循环,忽略之后所有字符;如果不是,则继续向下判断是否越界,每循环一次,res 就会 * 10 进位拼接一次,直到碰到非数字字符或数组终止时结束循环。
class Solution {
    // Solution2: 自定义函数
    // 需要注意的方面:
    // 1. 空格 -- (trim()方法去除首尾空格)
    // 2. 非 0~9 之间的字符 -- (如果当前字符不是0~9之间的数字,直接退出)
    // 3. 数字越界 -- int型的数据范围:[-2,147,483,648, 2,147,483,647], 即[-2^31, 2^31 - 1]
    // 4. 有符号 -- (设置变量 sign 作为标志位, 1:代表正, -1:代表负)
    public int strToInt(String str) {
        //去除str首尾的多余空格
        char[] array = str.trim().toCharArray();
        //如果array的长度为0 返回0
        if (array.length==0) return 0;
        //sign表示标志位  1为正  -1 为负  i代表array从何处开始遍历
        int res = 0, sign = 1, i = 1;
        //设置限制值,因为在遍历中先判断res是否越界,再向res赋值,因而对limit的要求/10
        int limit = Integer.MAX_VALUE / 10;
        //如果array[0]=- 表明该数是负数  sign =-1
        if (array[0]=='-') sign = -1;
        else if (array[0]!='+') i = 0;  // 代表此时符号位不存在,默认为正,且数字位从数组下标0开始
        for (int j = i; j < array.length; j++) {
            //判断当前字符是否为数字  不是直接退出
            if (array[j]>'9'||array[j]<'0') break;
            //判断遍历到j-1的位置后  res是否大于limit 如果当前res已经大于limit  加上array[j]一定越界
            //当res等于limit时,我们需要判断array[j]是否大于Integer.MAX_VALUE的末位数7
            if (res>limit || res==limit && array[j]>'7') return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            res = res * 10 + (array[j] - '0');
        }
        return res * sign;
    }
}

在这里插入图片描述

3. 参考资料

[1] 面试题67. 把字符串转换成整数(数字越界处理,清晰图解)-- Krahets

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

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

相关文章

day1 什么是互联网

目录 计算机网络的定义与分类 网络的网络 互联网的组成 互联网的边缘部分 互联网基础结构发展的三个阶段 第一阶段&#xff08;1969 - 1990&#xff09; 第二阶段&#xff08;1985 - 1993&#xff09; 第三阶段&#xff08;1993 - 现在&#xff09; 20世纪90年代&#xff…

项目经验总结——送给测试岗做项目的朋友们

目录 前言 1、项目排期时的时间预估能力欠佳 2、QA写单元测试 3、集成测试方案不够精简 4、排了优先级也很难取舍 5、搭完redis集群却不了解redis运行机制 总结 结语 前言 最近负责的L项目从3月初开始开发到6月底正式上线&#xff0c;这是我在工作快1年时间里第一次独…

机械键盘、口袋打印机,万元奖金等你拿!「万象格新」AI绘画X海报设计大赛即将开启...

号外&#xff01;「万象格新」大赛开启 如果阳光暖到你心里&#xff0c;那一定是一格在想你~ 春夏交替&#xff0c;万物焕发生机&#xff0c;明媚色彩娱情惬意 在这样一个美好的时节 如果你&#xff1a; 心中荡漾着色彩斑斓的 AI 绘画创意 想要 show 出独到的审美与非凡设计能力…

【系统集成项目管理工程师】项目干系人管理

&#x1f4a5;十大知识领域&#xff1a;项目干系人管理 项目干系人管理包括以下 4 个过程: 识别干系人规划干系人管理管理干系人参与控制干系人参与 一、识别干系人 输入工具与技术输出项目章程采购文件事业环境因素组织过程资产组织相关会议专家判断干系人分析干系人登记册 …

servlet(1)—javaEE

文章目录 1.认识servlet2.使用servlet2.1创建项目2.2引入依赖2.3创建目录2.4编写代码2.5打包2.6部署2.7运行2.8验证 3.开发步骤4.部署方式4.1打包4.2安装插件 5.访问出错的情况5.1 4045.2 4055.3其他 6.servlet的三大生命周期方法7.servlet api7.1HttpServlet7.2HttpServletReq…

想攀登金融领域高峰,中国人民大学与加拿大女王大学金融硕士是重要途径

每个人都希望自己的职场攀登是优质路线&#xff0c;最短路线。金融业招聘注重学历&#xff0c;最早外资投资银行招聘只要清北复交&#xff0c;现在知名金融机构工作也只招985。还有一个特点是&#xff0c;宁要国内清北复交&#xff0c;也不要海归留学。学历到底重不重要&#x…

响应式布局

文章目录 响应式布局概述viewport 视口CSS 常用单位CSS 媒体查询语法直接使用使用style标签使用link引入 自适应布局栅格系统响应式布局案例rem媒体查询 响应式布局 概述 响应式布局是指网站或应用程序可以自适应不同的屏幕尺寸和设备类型&#xff0c;简而言之就是一个网站兼…

ERTEC200P-2 PROFINET设备完全开发手册(8-2)

8.2 IRT通讯原理及API PROFINET RT通讯的特点&#xff1a; 典型的PROFINET网络如下图所示。 其中&#xff1a; T1: 采样输入 T2: IO背板周期 T3: Profinet I/O 通讯周期 T4: CPU组织块OB1执行周期 T5: Profinet I/O 通讯周期 T6: IO背板周期 T7: 建立输出 在PRO…

Java35-85

这里写目录标题 steam流collect超详解 方法引用静态方法中没有this&#xff01;&#xff01;&#xff01;引用本类或者父类的成员方法 引用构造方法引用方法成员引用数组的构造方法转成自定义对象获取部分属性并收集到数组 异常异常中的常见方法抛出 处理自定义异常File的概述和…

实验8 梯度下降法

1. 实验目的 ① 掌握深度学习框架中的自动求导机制&#xff1b; ② 掌握梯度下降法的基本原理&#xff0c;能够使用梯度下降法求解一元和多元线性回归问题。 2. 实验内容 ① 使用TensorFlow的可训练变量和自动求导机制实现梯度下降法&#xff1b; ② 使用梯度下降法训练线性…

2023-04-23 算法面试中常见的动态规划问题

动态规划 1 什么是动态规划 以菲波那切数列求和为例&#xff0c;通过 1.普通的递归2.引入记忆数组memo3.自下而上地解决问题&#xff0c;即动态规划 动态规划的定义 dynamic programming (also known as dynamic optimization) is a method for solving a complex problem by…

Redis-cli Go代码

Redis-cli Go代码 安装 go get github.com/redis/go-redis/v9 建立连接 import ("context""fmt""github.com/redis/go-redis/v9" )client : redis.NewClient(&redis.Options{Addr: "localhost:6379",Password: "", …

支付宝 网站支付Demo 案例【沙箱环境】IDEA如何配置启动Eclipse项目

前言 在跑支付宝提供的支付案例Demo的时候&#xff0c;遇到了一些问题。支付宝提供的Demo是用Eclipse跑的JAVAEE项目。我想用IDEA来跑一下看看、结果使用习惯了Mavne管理jar包和SpringBoot项目。启动web项目的时候&#xff0c;还遇到一些问题。特此记录遇到的一些小问题。顺便回…

c++之常见函数

文章目录 一、inline函数二、函数重载三、函数模板 一、inline函数 1.当进行函数的调用时&#xff0c;系统要建立栈空间&#xff0c;保护现场&#xff0c;传递参数等等&#xff0c;这些工作都需要系统时间和空间得开销然而inline 函数是以空间换时间的做法&#xff0c;省去调用…

FL Studio 21最新发布的版本主要的新功能

FL Studio 21是最新发布的版本,其主要的新功能有: 1. 全新的UI设计:FL 21采用全新的 FLAT UI 设计风格,简洁而不简单,颜值大大提高。 2. 多窗口支持:可以将FL Studio窗口分别显示在不同的显示器上,实现屏幕间切换和多视图编辑。 3. 混音台增强:新增后置通道、多输入输入和多…

反垃圾邮件产品技术要求和测试评价方法

声明 本文是学习信息安全技术 反垃圾邮件产品技术要求和测试评价方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 反垃圾邮件产品等级划分 根据产品功能要求和安全保证要求的不同&#xff0c;以及反垃圾邮件产品适用应用环境的不同&#xff0c;将…

ROS1学习笔记:常用可视化工具的使用(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;常用可视化工具的实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录 一、日志输出工具&#xff1a;rqt_console二、绘制数据曲线&#xff1a;rqt_plot三、 图像渲染工具&#xff1a;rqt_image_view四、图形界面总接口&#xff1a;r…

FE之TSNE:基于MNIST手写数字数据集利用T-SNE/TSNE方法实现高维数据集可视化应(二维可视化和三维可视化)应用案例之详细攻略

FE之TSNE&#xff1a;基于MNIST手写数字数据集利用T-SNE/TSNE方法实现高维数据集可视化应(二维可视化和三维可视化)应用案例之详细攻略 目录 基于MNIST手写数字数据集利用T-SNE/TSNE方法实现高维数据集可视化应(二维可视化和三维可视化)应用案例 # 1、定义数据集 # 2、数据预…

docker部署springboot(jar)项目的方式概括

1、docker挂载目录 实现原理&#xff1a;docker中只需要安装一个JDK镜像&#xff0c;把该镜像的目录挂载到外部的Linux中&#xff0c;如挂载到/usr/data/jar&#xff0c;我们只需要把Jenkins构建的jar文件传输到该目录中&#xff0c;在通过docker命令启动jar即可&#xff1a; …

【代码随想录】刷题Day5

1.链表重复节点删除 82. 删除排序链表中的重复元素 II 前后指针实现 1.做这道题最大的感受就是&#xff1a;不要觉得开辟空间浪费&#xff0c;多用临时变量去记录。越精确越容易成功 2.首先没有节点或者一个节点直接返回 3.因为头部会出现一样元素的情况&#xff0c;以至于我不…