当前位置: 首页 > news >正文

从暴力到滑动窗口全解析——力扣8. 字符串转换整数 (atoi)

力扣8. 字符串转换整数 (atoi)

在这里插入图片描述


【LeetCode题解】8. 字符串转换整数 (atoi) —— Java详细讲解与实现


一、题目描述

请你来实现一个 myAtoi(String s) 函数,使其能将字符串转换成一个 32 位有符号整数,算法流程如下:

  1. 丢弃前导空格:读入字符串并忽略开头所有空格 ' '
  2. 判断符号:如果下一个字符是 '+''-',则记录符号;否则默认是正数。
  3. 读取数字部分:从当前位置开始,连续读取数字字符并转换为整数。
  4. 遇到非数字或字符串末尾停止
  5. 溢出截断:若结果超出 32 位有符号整数范围 [−2³¹, 2³¹ − 1],则返回对应边界值。

二、示例

输入输出说明
"42"42直接转换
" -042"-42忽略空格和前导零
"1337c0d3"1337遇到非数字停止
"0-1"0数字后出现符号停止
"words and 987"0非数字开头返回 0

三、解题思路

这道题看似简单,但关键在于正确处理各种边界情况。我们可以将整个流程拆分为以下几个步骤:


1. 跳过前导空格

使用指针 i 从头遍历字符串,直到遇到第一个非空格字符。

while (i < n && s.charAt(i) == ' ') {i++;
}
if (i == n) return 0; // 全是空格

2. 处理符号

判断当前字符是否为 '+''-',并设置符号变量 sign

int sign = 1;
if (s.charAt(i) == '+' || s.charAt(i) == '-') {sign = (s.charAt(i) == '-') ? -1 : 1;i++;
}

3. 读取数字并防止溢出

逐位读取数字字符,转换为整数 digit,并实时判断是否会溢出。

int result = 0;
while (i < n && Character.isDigit(s.charAt(i))) {int digit = s.charAt(i) - '0';// 判断是否会溢出if (result > (Integer.MAX_VALUE - digit) / 10) {return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;}result = result * 10 + digit;i++;
}

4. 返回最终结果

计算并返回带符号的结果。

return result * sign;

四、完整 Java 实现

class Solution {public int myAtoi(String s) {int i = 0, n = s.length();int sign = 1;int result = 0;// 1. 跳过前导空格while (i < n && s.charAt(i) == ' ') {i++;}if (i == n) return 0;// 2. 处理符号if (s.charAt(i) == '+' || s.charAt(i) == '-') {sign = (s.charAt(i) == '-') ? -1 : 1;i++;}// 3. 读取数字并判断溢出while (i < n && Character.isDigit(s.charAt(i))) {int digit = s.charAt(i) - '0';if (result > (Integer.MAX_VALUE - digit) / 10) {return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;}result = result * 10 + digit;i++;}// 4. 返回最终结果return result * sign;}
}

在这里插入图片描述


五、复杂度分析

项目分析
时间复杂度O(n),遍历字符串一次
空间复杂度O(1),仅使用常量变量

六、常见错误点总结

  1. 忘记处理前导空格:直接从首字符开始解析会出错。
  2. 未考虑正负号:导致结果符号错误。
  3. 数字越界未判断:会导致运行时错误或结果错误。
  4. 读取数字后未停止:可能误解析额外字符。

七、总结

这道题的核心是:
严格按照题意模拟整个转换过程,并在每一步都处理边界情况

通过实现 myAtoi,我们不仅锻炼了对字符串处理的熟悉度,也提升了对“溢出控制”与“边界检测”的编程敏感性。
掌握这题之后,对类似的字符串解析类问题(如字符串转浮点数、表达式计算等)会更加得心应手。


http://www.dtcms.com/a/465958.html

相关文章:

  • 迅为RK3562开发板Android 系统动态替换开机logo的实现-替换logo
  • 基于Springboot + vue3实现的校园闲置物品交易平台
  • 学校网站 制作wordpress图片时间
  • MySQL分区分表实现方法详解
  • 缠论工具czsc快速使用入门(二)
  • Android 14 Input 事件派发机制深度剖析
  • 苏州做网站外包的公司有哪些许昌做网站团队
  • android 屏幕适配
  • ESP32开发:从Wi-Fi连接到MQTT通信
  • Linux工作队列workqueue的实现
  • 模板建站和开发网站区别wordpress 页面瀑布流
  • [C# starter-kit] 身份验证与授权 Identity JWT
  • C#通讯关键类的API
  • 网站开发说明书天元建设集团有限公司申请破产了吗
  • 分布式单例模式在微服务架构中的关键作用与实践
  • 网站footer模板建设银行甘肃省行网站
  • 网站建设和电商区别wordpress创建角色
  • 网站开发软件公司网站建设运营公司
  • Java开发环境搭建及基础练习
  • 【三维重建】即插即用的3DGS的PDE优化:高质量渲染和重建
  • TDS:连接器漫谈之可信空间中的沉默契约与隐秘通道
  • AI Compass前沿速览:DeepSeek-V3.2、Sora 2、Imagine v0.9、LONGLIVE–英伟达、xLLM、OpenAgents
  • 为什么要建设图书馆网站网站建设情况的报告
  • linux之 remoteproc 内核实现源码分析
  • vue 识别一个高亮组件全局
  • RFID与机械臂协同:构建智能产品溯源新范式
  • 生活馆网站开发背景网站制作如皋
  • 第二章数据预处理:公式Python代码实现
  • CSS的重绘和重排是什么?如何减少css的重绘和重排?
  • 哪个网站可以做专业兼职程序员用的编程软件