力扣第八题——字符串转换整数

题目介绍

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

函数 myAtoi(string s) 的算法如下:

  1. 空格:读入字符串并丢弃无用的前导空格(" "
  2. 符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。
  3. 转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
  4. 舍入:如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。

返回整数作为最终结果。

示例 1:

输入:s = "42"

输出:42

解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。

带下划线线的字符是所读的内容,插入符号是当前读入位置。
第 1 步:"42"(当前没有读入字符,因为没有前导空格)^
第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')^
第 3 步:"42"(读入 "42")^

示例 2:

输入:s = " -042"

输出:-42

解释:

第 1 步:"   -042"(读入前导空格,但忽视掉)^
第 2 步:"   -042"(读入 '-' 字符,所以结果应该是负数)^
第 3 步:"   -042"(读入 "042",在结果中忽略前导零)^

示例 3:

输入:s = "1337c0d3"

输出:1337

解释:

第 1 步:"1337c0d3"(当前没有读入字符,因为没有前导空格)^
第 2 步:"1337c0d3"(当前没有读入字符,因为这里不存在 '-' 或者 '+')^
第 3 步:"1337c0d3"(读入 "1337";由于下一个字符不是一个数字,所以读入停止)^

示例 4:

输入:s = "0-1"

输出:0

解释:

第 1 步:"0-1" (当前没有读入字符,因为没有前导空格)^
第 2 步:"0-1" (当前没有读入字符,因为这里不存在 '-' 或者 '+')^
第 3 步:"0-1" (读入 "0";由于下一个字符不是一个数字,所以读入停止)^

示例 5:

输入:s = "words and 987"

输出:0

解释:

读取在第一个非数字字符“w”处停止。

提示:

  • 0 <= s.length <= 200
  • s 由英文字母(大写和小写)、数字(0-9)、' ''+''-' 和 '.' 组成

完整代码

class Solution {public int myAtoi(String str) {Automaton automaton = new Automaton();int length = str.length();for (int i = 0; i < length; ++i) {automaton.get(str.charAt(i));}return (int) (automaton.sign * automaton.ans);}
}class Automaton {public int sign = 1;public long ans = 0;private String state = "start";private Map<String, String[]> table = new HashMap<String, String[]>() {{put("start", new String[]{"start", "signed", "in_number", "end"});put("signed", new String[]{"end", "end", "in_number", "end"});put("in_number", new String[]{"end", "end", "in_number", "end"});put("end", new String[]{"end", "end", "end", "end"});}};public void get(char c) {state = table.get(state)[get_col(c)];if ("in_number".equals(state)) {ans = ans * 10 + c - '0';ans = sign == 1 ? Math.min(ans, (long) Integer.MAX_VALUE) : Math.min(ans, -(long) Integer.MIN_VALUE);} else if ("signed".equals(state)) {sign = c == '+' ? 1 : -1;}}private int get_col(char c) {if (c == ' ') {return 0;}if (c == '+' || c == '-') {return 1;}if (Character.isDigit(c)) {return 2;}return 3;}
}

 思路解析

1. 类 Solution

方法 myAtoi
  • 功能:将字符串转换为整数。
  • 参数str,表示输入的字符串。
  • 返回值:转换后的整数。

该方法首先创建一个 Automaton 对象,然后遍历字符串中的每个字符,调用 Automaton 对象的 get 方法进行处理。最后返回经过处理的整数结果。

2. 类 Automaton

成员变量
  • sign:表示正负号,默认为 1(正数)。
  • ans:存储转换后的整数结果。
  • state:表示当前状态,初始为 “start”。
  • table:状态转移表,用于根据当前状态和字符类型确定下一个状态。
方法 get
  • 功能:根据当前字符和状态,更新状态并处理整数转换。
  • 参数c,表示当前处理的字符。

该方法首先根据当前状态和字符类型,从状态转移表中获取下一个状态。然后根据下一个状态执行相应的操作:

  • 如果状态为 “in_number”,则将当前字符转换为整数并累加到 ans 中。同时,检查 ans 是否超出整数范围,并进行截断处理。
  • 如果状态为 “signed”,则根据字符是 ‘+’ 还是 ‘-’ 设置 sign 的值。
方法 get_col
  • 功能:根据字符类型返回对应的列索引。
  • 参数c,表示当前处理的字符。
  • 返回值:列索引,用于在状态转移表中查找下一个状态。

该方法根据字符类型返回对应的列索引:

  • 空格:返回 0
  • 正负号:返回 1
  • 数字:返回 2
  • 其他字符:返回 3

代码执行流程

  1. 创建 Automaton 对象,初始化状态为 “start”。
  2. 遍历输入字符串中的每个字符。
  3. 调用 Automaton 对象的 get 方法,根据当前字符和状态进行状态转移。
  4. 在状态转移过程中,如果遇到数字,则累加到 ans 中,并处理整数范围溢出。
  5. 如果遇到正负号,则设置 sign 的值。
  6. 遍历结束后,根据 sign 和 ans 计算最终结果并返回。

知识点精炼

  1. 字符串处理:掌握字符串的基本操作,如遍历和字符类型判断。
  2. 有限状态机:理解状态机的概念,能够根据不同输入进行状态转移。
  3. 符号识别:能够处理正负号,并影响最终结果的符号。
  4. 整数累加与范围控制:在累加过程中注意整数类型的范围限制,防止溢出。
  5. 映射表应用:利用哈希表实现状态转移逻辑,提高代码的可读性和效率

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

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

相关文章

TCP重传、滑动窗口、流量控制、拥塞控制机制

目录 1、TCP重传机制超时重传快速重传 2、滑动窗口3、流量控制4、拥塞控制1、慢启动2、拥塞避免3、拥塞发生 1、TCP重传机制 TCP 针对数据包丢失的情况&#xff0c;会用重传机制解决。 超时重传 就是在发送数据时&#xff0c;设定一个定时器&#xff0c;当超过指定的时间还没…

Ctrl+C、Ctrl+V、Ctrl+X 和 Ctrl+Z 的起源

注&#xff1a;机翻&#xff0c;未校对。 The Origins of CtrlC, CtrlV, CtrlX, and CtrlZ Explained We use them dozens of times a day: The CtrlZ, CtrlX, CtrlC, and CtrlV shortcuts that trigger Undo, Cut, Copy, and Paste. But where did they come from, and why do…

文件上传接口

文章目录 开发前端接口 开发前端接口 首先这个前端的文件上传组件使用了,前端组件 首先这个接口不是一般的接口,这个接口可以提取出来,之后那里使用了,就直接放到哪里 所以这是一个万能文件上传接口 写完之后选择 头像组件 在图库中添加组件 写前端组件之后,写了前端的组件…

Bootstrap 5 加载效果

Bootstrap 5 加载效果 Bootstrap 5 是一个流行的前端框架,它提供了丰富的组件和工具,用于快速开发响应式和移动优先的网页。在本文中,我们将探讨 Bootstrap 5 中的加载效果,包括如何实现它们以及它们在网页设计中的作用。 什么是加载效果? 加载效果是在网页或应用程序中…

k8s集群创建devops项目一直等待状态,没有发现host

问题分析&#xff1a; kubesphere在帮我们自动化创建一些智能自动化的额时候难免会发生一些小错误&#xff0c;devops-jenkins是一个部署也会生成一个容器组即pod&#xff0c;容器组的容器服务端口是 targetPort&#xff0c;容器组对外暴露的端口是port&#xff0c;拿devops-c…

[深度学习]基于yolov10+streamlit目标检测演示系统设计

YOLOv10结合Streamlit构建的目标检测系统&#xff0c;不仅极大地增强了实时目标识别的能力&#xff0c;还通过其直观的用户界面实现了对图片、视频乃至摄像头输入的无缝支持。该系统利用YOLOv10的高效检测算法&#xff0c;能够快速准确地识别图像中的多个对象&#xff0c;并标注…

Billu_b0x靶机

信息收集 使用arp-scan 生成网络接口地址来查看ip 输入命令&#xff1a; arp-scan -l 可以查看到我们的目标ip为192.168.187.153 nmap扫描端口开放 输入命令&#xff1a; nmap -min-rate 10000 -p- 192.168.187.153 可以看到开放2个端口 nmap扫描端口信息 输入命令&…

配置PYTHONPATH环境变量

配置PYTHONPATH环境变量 前言Win系统临时配置永久配置 Linux系统临时配置永久配置 前言 在运行py脚本时不仅需要import官方库&#xff0c;经常会import自己编写的脚本&#xff0c;但此时会出现模块找不到的如下报错。解决方法是配置PYTHONPATH&#xff0c;下文介绍Win系统和Li…

禹神:一小时快速上手Electron,前端Electron开发教程,笔记。一篇文章入门Electron

一、Electron是什么 简单的一句话&#xff0c;就是用htmlcssjsnodejs&#xff08;Native Api&#xff09;做兼容多个系统&#xff08;Windows、Linux、Mac&#xff09;的软件。 官网解释如下(有点像绕口令)&#xff1a; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面…

Resources.Load返回null

Resources.Load返回null 在unity中Resources.Load从Assets下的任意Resources目录下读取资源&#xff0c;比如从Assets\Resources下读取Cube&#xff08;预制体&#xff09;&#xff0c;当然也可以读取其他资源 代码为 GameObject prefab Resources.Load<GameObject>(…

微软Edge浏览器深度解析:性能、安全性与特色功能全面评测

一、引言 自Windows 10操作系统推出以来&#xff0c;微软Edge浏览器作为默认的网页浏览器&#xff0c;凭借其现代化的设计和出色的性能表现&#xff0c;逐渐获得了用户的认可。本文旨在对Edge浏览器进行深入分析&#xff0c;探讨其在多个方面的表现。 二、界面与操作体验 界面…

在 PostgreSQL 里如何处理数据的存储优化和数据库备份的效率平衡?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何处理数据的存储优化和数据库备份的效率平衡&#xff1f;一、数据存储优化&#x…

HTML表格表单及框架标签

一.表格标签 1.<table></table> 创建表格 2.<caption></caption> 表格的标题 3.<tr></tr>Table Row&#xff08;表格行&#xff09; 4.<td></td>Table Data&#xff08;表格数据&#xff09;其中有属性rowspan"2&quo…

Linux操作系统——数据库

数据库 sun solaris gnu 1、分类&#xff1a; 大型 中型 小型 ORACLE MYSQL/MSSQL SQLITE DBII powdb 关系型数据库 2、名词&#xff1a; DB 数据库 select update database DBMS 数据…

Go中的defer看似很简单,实则一点都不难

Golang 中的 Defer 在Go语言中&#xff0c;defer语句用于将一个函数调用推迟到外围函数返回之后执行。它常用于确保某些操作在函数结束时一定会执行&#xff0c;例如资源释放、文件关闭等。 基本语法 defer语句的基本使用方法如下&#xff1a; func main() {defer fmt.Prin…

距离变换 Distance Transformation

以下为该学习地址的学习笔记&#xff1a;Distance transformation in image - Python OpenCV - GeeksforGeeks 其他学习资料&#xff1a;Morphology - Distance Transform 简介 距离变换是一种用于计算图像中每个像素与最近的非零像素之间距离的技术。它通常用于图像分割和物体…

51单片机5(GPIO简介)

一、序言&#xff1a;不论学习什么单片机&#xff0c;最简单的外设莫过于I口的高低电平的操作&#xff0c;接下来&#xff0c;我们将给大家介绍一下如何在创建好的工程模板上面&#xff0c;通过控制51单片机的GPIO来使我们的开发板上的LED来点亮。 二、51单片机GPIO介绍&#…

第三节SHELL脚本中的变量与运算(1.1-1.5)

一,脚本中的变量 1,1什么是变量 在编写程序是,通常会遇到被操作对象不固定的情况我们需要用一串固定的字符来的表示不固定的值,这就是变量存在的根本意义变量的实现原理就是内存存储单元的一个符合名称 1,2 变量的命名规则 变量的名称中只能包含数字,大小写字母以及下划线 …

PySide在Qt Designer中使用QTableView 显示表格数据

在 PySide6 中&#xff0c;可以使用 Qt Model View 架构中的 QTableView 部件来显示和编辑表格数据。 1、创建ui文件 在Qt Designer中新建QMainWindow&#xff0c;命名为csvShow.ui。QMainWindow上有两个部件&#xff1a;tableview和btn_exit。 2、使用pyuic工具将ui文件转换为…

Kafka(四) Consumer消费者

一&#xff0c;基础知识 1&#xff0c;消费者与消费组 每个消费者都有对应的消费组&#xff0c;不同消费组之间互不影响。 Partition的消息只能被一个消费组中的一个消费者所消费&#xff0c; 但Partition也可能被再平衡分配给新的消费者。 一个Topic的不同Partition会根据分配…