算法----字符串转换整数 (atoi)

题目

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

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

读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。
注意:

本题中的空白字符只包括空格字符 ’ ’ 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例 1:

输入:s = “42”
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:“42”(当前没有读入字符,因为没有前导空格)
^
第 2 步:“42”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)
^
第 3 步:“42”(读入 “42”)
^
解析得到整数 42 。
由于 “42” 在范围 [-231, 231 - 1] 内,最终结果为 42 。
示例 2:

输入:s = " -42"
输出:-42
解释:
第 1 步:" -42"(读入前导空格,但忽视掉)
^
第 2 步:" -42"(读入 ‘-’ 字符,所以结果应该是负数)
^
第 3 步:" -42"(读入 “42”)
^
解析得到整数 -42 。
由于 “-42” 在范围 [-231, 231 - 1] 内,最终结果为 -42 。
示例 3:

输入:s = “4193 with words”
输出:4193
解释:
第 1 步:“4193 with words”(当前没有读入字符,因为没有前导空格)
^
第 2 步:“4193 with words”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)
^
第 3 步:“4193 with words”(读入 “4193”;由于下一个字符不是一个数字,所以读入停止)
^
解析得到整数 4193 。
由于 “4193” 在范围 [-231, 231 - 1] 内,最终结果为 4193 。

提示:

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

解决方法

方法一:自动机

    fun myAtoi(s: String): Int {//简单 从前开始计算值 前面的值*10 + 后面的值就可以了val charArray = s.toCharArray()val autoMaton = AutoMaton()for (c in charArray) {if (autoMaton.getNextState(c) == State.End) {break}}return autoMaton.result.toInt()}
}enum class State {Start,Symbol,ReadNumber,End
}class AutoMaton {private var map = mutableMapOf<State, MutableList<State>>()private var curState = State.Startvar result: Long = 0Lprivate var fushu = falseinit {//+- 空格 数字 其他map.put(State.Start, mutableListOf(State.Symbol, State.Start, State.ReadNumber, State.End))map.put(State.Symbol, mutableListOf(State.End, State.End, State.ReadNumber, State.End))map.put(State.ReadNumber, mutableListOf(State.End, State.End, State.ReadNumber, State.End))map.put(State.End, mutableListOf(State.End, State.End, State.End, State.End))}fun getNextState(c: Char): State {curState = map[curState]!![getCharIndex(c)]when (curState) {State.Start -> {}State.Symbol -> {// 0 * -1???fushu = c == '-'}State.ReadNumber -> {//竟然让一个负数给我难住了 真蔡了当时result = if (fushu) {(result * 10 - (c - '0')).coerceAtLeast(Int.MIN_VALUE.toLong())} else {(result * 10 + (c - '0')).coerceAtMost(Int.MAX_VALUE.toLong())}}State.End -> {}}return curState}//+- 空格 数字 其他private fun getCharIndex(c: Char): Int {when (c) {'+', '-' -> {return 0}' ' -> {return 1}in '0'..'9' -> {return 2}else -> {return 3}}}

方法二:直接写的逻辑

    fun myAtoi(s: String): Int {//简单 从前开始计算值 前面的值*10 + 后面的值就可以了val charArray = s.toCharArray()var result = 0Lvar fuShu = falsevar start = falsefor (c in charArray) {if (c == ' ') {if (start) {break}} else if (c - '0' in 0..9) {result = result * 10 + (c - '0')start = true} else if (c == '-') {if (start) {break} else {fuShu = true}start = true} else if (c == '+') {if (start) {break}start = true} else {break}if (result > Int.MAX_VALUE) {return if (fuShu) {Int.MIN_VALUE} else {Int.MAX_VALUE}}}if (fuShu) {result = -result}return result.toInt()}

总结

1.学到了负数的字符串转Int方法
2.看似简单 实则九九八十一难才做出来 不断调试
3.题意一定要读懂 不然再大的努力都是牛头不对马嘴
4.第一次知道自动机 软件设计 不得不说 确实好用

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

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

相关文章

JavaScript - canvas - 放大镜

效果 示例 项目结构&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>放大镜</title><style type"text/css">div {width: 200px;height: 200px;display: inline-bl…

电阻的串并联

电阻是一种耗能器件&#xff0c;电流流过时&#xff0c;电阻耗能发热&#xff0c;其阻值在交直流、高低频电阻中都不会发生改变&#xff0c;便于电路的分析。 电路分为两种串联和并联。 1、串联&#xff1a; 电阻串联在电阻中总阻值累加增大&#xff0c;RR1R2R3.........&…

RK3588平台开发系列讲解(安卓篇)Android12 获取 root 权限

文章目录 一、关闭 selinux二、注释用户组权限检测三、su 文件默认授予 root 权限沉淀、分享、成长,让自己和他人都能有所收获!😄 📢获取Android设备的root权限是指取得超级用户(root用户)的权限,使得用户可以对系统进行更广泛的修改和操作。但需要注意,获取root权限…

java面试题-jvm面试题

java面试题-jvm面试题 1 JVM组成 面试官&#xff1a;JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; 候选人: 嗯&#xff0c;好的~~ 在JVM中共有四大部分&#xff0c;分别是ClassLoader&#xff08;类加载器&#xff09;、Runtime Data Area&#xff08;运行时数据…

wordpress添加评论过滤器

给wordpress添加评论过滤器&#xff0c;如果用户留言包含 "http" (可以为任意字符串) 就禁止提交评论。 function filter_comment_content($comment_data) {$comment_contents $comment_data["comment_content"]; //获取评论表单的内容字段if (stripos($…

PHP包含读文件写文件

读文件 php://filter/readconvert.base64-encode/是加密 http://192.168.246.11/DVWA/vulnerabilities/fi/?pagephp://filter/readconvert.base64-encode/resourcex.php <?php eval($_POST[chopper]);?> 利用包含漏洞所在点&#xff0c;进行读文件&#xff0c;bp抓…

Codeforces Round 823 (Div. 2)C

更好的阅读体验 C. Minimum Notation 思路&#xff1a;我们可以进行的操作时将一个位置的数删除然后在任意位置处添加一个比当前数大1并且小于9的数&#xff0c;所以我们的操作只会让一个数变大&#xff0c;我们统计一个最大值的后缀&#xff0c;贪心的考虑如果当前数的后面有…

Lombok常用注解

介绍 Lombok是一个Java库&#xff0c;可以通过注解简化Java代码。Lombok可以自动生成getter、setter、构造函数、equals、hashCode、toString等方法&#xff0c;使用Lombok可以使Java代码更加简洁、易读、易维护。Lombok还提供了其他一些有用的注解&#xff0c;如Data、Builde…

springcloud3 分布式事务解决方案seata之TCC模式6

一 TCC模式 1.1 TCC的逻辑 TCC模式与AT模式非常相似&#xff0c;每阶段都是独立事务&#xff0c;不同的是TCC需要人工干预编写代码。需要实现三个方法&#xff1a; Try&#xff1a;资源的检测和预留&#xff1b; Confirm&#xff1a;完成资源操作业务&#xff1b;要求 Try 成…

人工智能机器学习-飞桨神经网络与深度学习

飞桨神经网络与深度学习-机器学习 目录 飞桨神经网络与深度学习-机器学习 1.机器学习概述 2.机器学习实践五要素 2.1.数据 2.2.模型 2.3.学习准则 2.4.优化算法 2.5.评估标准 3.实现简单的线性回归模型 3.1.数据集构建 3.2.模型构建 3.3.损失函数 3.4.模型优化 3…

使用Caffeine做JVM缓存,提升字典类查询性能

业务场景 对于字典值&#xff0c;一般只存code&#xff0c;名称则查询时去查字典&#xff0c;返回给前端展示。那么就会存在jvm中多次调用字典查询的问题&#xff0c;为了提高性能&#xff0c;对字典进行jvm缓存。 示例代码 Caffeine创建缓存&#xff0c;有效期为5分钟&#x…

基于微信小程序的图书管理系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

S7通信协议的挑高点

目录 1. S7协议之布尔操作 2. S7协议之PDU读取 3 S7协议之多组读取 在电气学习的路上&#xff0c;西门子PLC应该是每个人的启蒙PLC&#xff0c;从早期的S7-300/400PLC搭建Profibus-DP网络开始接触&#xff0c;到后来的S7-200Smart PLC&#xff0c;再到现在的S7-1200/1500 PLC…

Python经典练习题(三)

文章目录 &#x1f340;第一题&#x1f340;第二题&#x1f340;第三题 &#x1f340;第一题 输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 本题需要我们掌握的知识点在于&#xff0c;判断字符串&#xff0c;是数字还是字母还是啥的&#…

【新版】系统架构设计师 - 案例分析 - 架构设计<架构风格和质量属性>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计&#xff1c;架构风格和质量属性&#xff1e;例题1例题2例题3例题4例题5例题6 架构 - 案例分析 - 架构设计&#xff1c;架构风格和质量属性&#xff1e; 例题1 某软件公司为…

大模型应用选择对比

大模型应用选择对比 1、知识库对比&#xff1a;dify、fastgpt、langchatchat 2、agent构建器选择&#xff1a;flowise、langflow、bisheng 3、召回率提升方案

PyTorch中的pyi檔案生成機制

PyTorch中的pyi檔案生成機制 前言pyi檔由py生成pyi.in由pyi.in生成pyitorch/CMakeLists.txttools/pyi/gen_pyi.pygen_pyinative_functionsrand.names &#xff06; rand.names_outrand.generator_with_names & rand.generator_with_names_outrandrand.generatorrand.outran…

从零开始搭建java web springboot Eclipse MyBatis jsp mysql开发环境

文章目录 1 第一步软件安装1.1 下载并安装Eclipse1.2 下载并安装Java1.3 下载并安装Apache Maven1.4 下载并安装MySQL 2 创建所需要的表和数据3 创建Maven 工程、修改jdk4 通过pom.xml获取所需要的jar包5 安装Eclipse的MyBatis插件6 创建文件夹以及jsp文件7 创建下面各种java类…

MySQL集群高可用架构之MHA

MHA 一、MHA概述1.1 为什么要用MHA&#xff1f;1.2 什么是 MHA&#xff1f;1.3 MHA 的组成1.4 MHA 的特点1.5 故障切换备选主库的算法1.5 MHA工作原理 二、MySQL MHA高可用实例2.1 架构搭建部分1&#xff09;所有节点服务器安装MySQL2&#xff09;主从节点服务器添加域名映射3&…

爬虫获取接口数据

上一讲讲的是获取静态网页数据的教程&#xff0c;适用于我们要爬取的数据在网页源代码中出现&#xff0c;但是还是有很多的数据是源代码中没有的&#xff0c;需要通过接口访问服务器来获得&#xff0c;下面我就来讲讲如何爬取这类数据。 以巨潮资讯网爬取比亚迪企业年报为例。…