leetcode8.字符串转换整数

文章描述了一个名为myAtoi的函数,其功能类似于C/C++的atoi,用于将字符串转换成32位有符号整数。函数的处理步骤包括处理前导空格、判断正负号、读取数字以及检查数值范围。示例展示了如何处理输入字符串,并给出了最优解决方案的详细步骤,包括遍历字符串、更新结果和处理超出范围的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串转换整数

请你来实现一个 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 。

最优解决方案

  • 首先,我们需要定义一个变量 result 来存储最终的整数结果,初始值为 0。
  • 然后,我们需要定义一个变量 sign 来存储正负号,初始值为 1。
  • 接着,我们需要遍历字符串 s 的每个字符,从左到右。
  • 对于每个字符 c ,我们需要进行以下判断:
  • 如果 c 是空格字符 ’ ’ ,并且 result 还是 0 ,那么我们可以忽略它,继续遍历下一个字符。
  • 如果 c 是正号 ‘+’ 或者负号 ‘-’ ,并且 result 还是 0 ,那么我们可以根据 c 的值来更新 sign 的值,分别为 1 或者 -1 ,然后继续遍历下一个字符。
  • 如果 c 是数字字符 ‘0’ 到 ‘9’ ,那么我们可以根据 c 的值来更新 result 的值,具体的公式是 result = result * 10 + (c - ‘0’) * sign 。这样就可以将每个数字字符转换为对应的整数,并且考虑了正负号的影响。然后继续遍历下一个字符。
  • 如果 c 不是上述三种情况中的任何一种,那么我们可以停止遍历字符串 s ,因为后面的字符对于整数转换没有意义。
  • 最后,我们需要检查 result 是否超过了 32 位有符号整数的范围 [−2^31, 2^31 − 1] 。如果超过了,那么我们需要将 result 截断为范围内的最大或者最小值。如果没有超过,那么我们就可以直接返回 result 作为最终结果。

例子

假设输入的字符串 s 是 " -123abc" ,那么我们可以按照以下步骤来执行这个方法:

  • 首先,我们定义 result = 0 , sign = 1 。
  • 然后,我们遍历字符串 s 的每个字符,从左到右。
  • 对于第一个字符 ’ ’ ,因为它是空格字符,并且 result 还是 0 ,所以我们忽略它,继续遍历下一个字符。
  • 对于第二个字符 ‘-’ ,因为它是负号,并且 result 还是 0 ,所以我们根据它的值来更新 sign 的值为 -1 ,然后继续遍历下一个字符。
  • 对于第三个字符 ‘1’ ,因为它是数字字符,所以我们根据它的值来更新 result 的值,具体的公式是 result = result * 10 + (c - ‘0’) * sign 。将 c 替换为 ‘1’ ,得到 result = 0 * 10 + (1 - 0) * (-1) = -1 。然后继续遍历下一个字符。
  • 对于第四个字符 ‘2’ ,因为它也是数字字符,所以我们同样根据它的值来更新 result 的值,具体的公式还是 result = result * 10 + (c - ‘0’) * sign 。将 c 替换为 ‘2’ ,得到 result = -1 * 10 + (2 - 0) * (-1) = -12 。然后继续遍历下一个字符。
  • 对于第五个字符 ‘3’ ,因为它也是数字字符,所以我们同样根据它的值来更新 result 的值,具体的公式还是 result = result * 10 + (c - ‘0’) * sign 。将 c 替换为 ‘3’ ,得到 result = -12 * 10 + (3 - 0) * (-1) = -123 。然后继续遍历下一个字符。
  • 对于第六个字符 ‘a’ ,因为它不是空格、正负号或者数字字符,所以我们停止遍历字符串 s ,因为后面的字符对于整数转换没有意义。
  • 最后,我们检查 result 是否超过了 32 位有符号整数的范围 [−2^31, 2^31 − 1] 。显然没有超过,所以我们直接返回 result 即可。最终结果就是 -123。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值