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

news/2024/4/26 4:45:02/文章来源:https://blog.csdn.net/qq_41071754/article/details/130324727

题目链接: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 返回0if (array.length==0) return 0;//sign表示标志位  1为正  -1 为负  i代表array从何处开始遍历int res = 0, sign = 1, i = 1;//设置限制值,因为在遍历中先判断res是否越界,再向res赋值,因而对limit的要求/10int limit = Integer.MAX_VALUE / 10;//如果array[0]=- 表明该数是负数  sign =-1if (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的末位数7if (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.luyixian.cn/news_show_102269.aspx

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

相关文章

研究生考试 之 计算机网络第七版(谢希仁) 第一章 课后答案

研究生考试 之 计算机网络第七版(谢希仁) 第一章 课后答案 目录 研究生考试 之 计算机网络第七版(谢希仁) 第一章 课后答案 一、简单介绍 二、计算机网络第七版(谢希仁) 第一章 课后答案 1、 计算机网络向用户可以提供哪些服务&#xff1f; 2、 试简述分组交换的要点。 3…

Kali下部署-Nessus漏扫工具

Nessus 是全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用Nessus 作为扫描该机构电脑系统的软件。 特点&#xff1a; 1、提供完整的电脑漏洞扫描服务&#xff0c;并随时更新漏洞库。 2、可以在本机或者是远端上进行遥控&#xff0c;进行系统的漏洞扫…

常见的四种排名函数的用法(sql)

四个排名函数&#xff1a; 1.row_number 2.rank 3.dense_rank 4.ntile 1. ROW_NUMBER&#xff08;排名场景推荐&#xff09; 1.1 介绍 在 SQL 中&#xff0c;ROW_NUMBER() 是一个窗口函数&#xff0c;它为结果集中的每一行分配一个唯一的序号。该函数的语法如下&#xff1a; …

JavaSE-part1

文章目录 Day01 面向对象特性1.java继承注意点2.多态2.1多态概述2.2多态中成员的特点:star::star:2.3多态的转型:star::star: 3.Super4.方法重写:star::star:5.Object类:star::star: Day02 面向对象特性1.代码块:star:(主要是初始化变量&#xff0c;先于构造器)2.单例设计模式:…

【移动端网页布局】移动端网页布局基础概念 ⑦ ( 在 PhotoShop 中使用 Cutterman 切二倍图 | 使用二倍图作为背景图像 )

文章目录 一、在 PhotoShop 中使用 Cutterman 切二倍图二、使用二倍图作为背景图像 一、在 PhotoShop 中使用 Cutterman 切二倍图 参考 【CSS】PhotoShop 切图 ③ ( PhotoShop 切图插件 - Cutterman | 下载、安装、启动、注册、登录 Cutterman - 切图神奇 插件 | 使用插件进行切…

3自由度并联绘图机器人实现写字功能(一)

1. 功能说明 本文示例将实现R305样机3自由度并联绘图机器人写字的功能。 2. 电子硬件 在这个示例中&#xff0c;采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板Bigfish2.1扩展板电池7.4V锂电池 3. 功能…

远程访问及控制ssh

SSH远程管理 OpenSSH服务器 SSH(Secure Shell) 协议 是一种安全通道协议。主要用来实现字符界面的远程登录、远程复制等功能。对通信数据进行了加密处理&#xff0c;用于远程管理其中包括用户登录时输入的用户口令。因此SSH协议具有很好的安全性------------&#xff08;同样…

d2l Transformer

终于到变形金刚了&#xff0c;他的主要特征在于多头自注意力的使用&#xff0c;以及摒弃了rnn的操作。 目录 1.原理 2.多头注意力 3.逐位前馈网络FFN 4.层归一化 5.残差连接 6.Encoder 7.Decoder 8.训练 9.预测 1.原理 主要贡献&#xff1a;1.纯使用attention的Enco…

Android程序员向音视频进阶,有前景吗

随着移动互联网的普及和发展&#xff0c;Android开发成为了很多人的就业选择&#xff0c;希望在这个行业能获得自己的一席之地。然而&#xff0c;随着时间的推移&#xff0c;越来越多的人进入到了Android开发行业&#xff0c;就导致目前Android开发的工作越来越难找&#xff0c…

EFI Driver Model(下)-USB 驱动设计

1、USB简介 通用串行总线&#xff08;英语&#xff1a;Universal Serial Bus&#xff0c;缩写&#xff1a;USB&#xff09;是一种串口总线标准&#xff0c;也是一种输入输出接口的技术规范&#xff0c;被广泛地应用于个人电脑和移动设备等信息通讯产品&#xff0c;并扩展至摄影…

我看谁没看过

vue在新窗口打开页面方法 const { href } this.$router.resolve({path: "/officePlatform/addPrompt"});window.open(href, "_blank"); 添加圆形标志 h3::before {content: "";display: inline-block;width: 13px;height: 13px;background: va…

NFT介绍及监管规则

什么是NFT NFT是Non-Fungible Token&#xff08;非同质化代币&#xff09;的缩写。 NFT是“Non-Fungible Token”的缩写&#xff0c;即非同质化代币。不同于FT&#xff08;Fungible Token&#xff0c;同质化代币&#xff09;&#xff0c;每一个NFT都是独一无二且不可相互替代的…

第二章 Maven 核心程序解压和配置

第一节 Maven核心程序解压与配置 1、Maven 官网地址 首页&#xff1a; Maven – Welcome to Apache Maven(opens new window) 下载页面&#xff1a; Maven – Download Apache Maven(opens new window) 下载链接&#xff1a; 具体下载地址&#xff1a;https://dlcdn.apac…

【云原生】Java 应用程序在 Kubernetes 上棘手的内存管理

文章目录 引言JVM 内存模型简介非 Heap 内存Heap 堆内存Kubernetes 内存管理JVM 和 Kubernetes场景 1 — Java Out Of Memory 错误场景 2 — Pod 超出内存 limit 限制场景 3 — Pod 超出节点的可用内存场景 4 — 参数配置良好&#xff0c;应用程序运行良好 结语 引言 如何结合…

三月、四月总计面试碰壁15次,作为一个27岁的测试工程师.....

3年测试经验原来什么都不是&#xff0c;只是给你的简历上画了一笔&#xff0c;一直觉得经验多&#xff0c;无论在哪都能找到满意的工作&#xff0c;但是现实却是给我打了一个大巴掌&#xff01;事后也不会给糖的那种... 先说一下自己的个人情况&#xff0c;普通二本计算机专业…

JVM调优最佳参数

项目背景 C端的项目&#xff0c;用户量比较多&#xff0c;请求比较多。 启动参数表 Xmx指定应用程序可用的最大堆大小。 Xms指定应用程序可用的最小堆大小。 &#xff08;一般情况下&#xff0c;需要设置Xmx和Xms为相等的值&#xff0c;且为一个固定的值&#xff09; 如果该值…

图像处理:均值滤波算法

目录 前言 概念介绍 基本原理 Opencv实现中值滤波 Python手写实现均值滤波 参考文章 前言 在此之前&#xff0c;我曾在此篇中推导过图像处理&#xff1a;推导五种滤波算法&#xff08;均值、中值、高斯、双边、引导&#xff09;。这在此基础上&#xff0c;我想更深入地研…

使用状态机实现幂等性

文章目录 背景幂等概念适用场景示例代码上述代码状态流转 背景 在某些场景下&#xff0c;可以使用状态机来实现幂等性。将业务流程抽象为一个状态机&#xff0c;定义各个状态之间的转换规则。当收到一个请求时&#xff0c;根据当前状态和请求类型来判断是否允许执行操作&#x…

数学知识四

容斥原理 S表示面积&#xff0c;下面公式可求出不相交的面积 2个圆的公式是这样 4个圆的面积是 总面积-所有俩俩相交的面积所有三三相交的面积-四四相交的面积&#xff0c;公式里加和减互相出现。 从n个集合里面挑一个一直到从n个集合里面挑n个 1-10中&#xff0c;能被2&#x…

【 SpringBoot单元测试 和 Mybatis 增,删,改 操作 】

文章目录 一、Spring-Boot单元测试(了解)1.1 概念1.2 单元测试引用1.3 单元测试的实现1.4 简单的断言说明1.5 单元测试优点 二、Mybatis 增&#xff0c;删&#xff0c;改 操作2.1 增加⽤户操作2.2 修改⽤户操作2.3 删除⽤户操作 一、Spring-Boot单元测试(了解) 1.1 概念 单元测…