一、题目概述
二、思路方向
要实现这个功能,我们可以遵循以下步骤来编写
myAtoi
函数:
- 去除前导空格:使用循环或字符串的
trim()
方法(虽然直接操作字符串更高效的方式是使用循环)。- 检查符号:记录第一个非空格字符是 '+'、'-' 还是数字,如果都不是则直接返回 0。
- 转换数字:从记录的起始位置开始,循环遍历字符串,将每个字符转换为数字,并累加到一个整数变量中。注意处理整数溢出的情况。
- 处理溢出:在累加过程中,检查当前结果是否超出了 32 位有符号整数的范围。
三、代码实现
public class Solution { public int myAtoi(String s) { s = s.trim(); if (s.isEmpty()) return 0; int index = 0; int sign = 1; long num = 0; // 使用 long 来避免在转换过程中溢出 // 检查符号 if (s.charAt(index) == '-') { sign = -1; index++; } else if (s.charAt(index) == '+') { index++; } // 转换数字 while (index < s.length() && Character.isDigit(s.charAt(index))) { int digit = s.charAt(index) - '0'; // 检查溢出 if (num > Integer.MAX_VALUE / 10 || (num == Integer.MAX_VALUE / 10 && digit > 7)) { return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE; } num = num * 10 + digit; index++; } return (int) (sign * num); } public static void main(String[] args) { Solution solution = new Solution(); System.out.println(solution.myAtoi(" -42")); // 输出 -42 System.out.println(solution.myAtoi("4193 with words")); // 输出 4193 System.out.println(solution.myAtoi("words and 987")); // 输出 0 System.out.println(solution.myAtoi("-91283472332")); // 输出 -2147483648 }
}
执行结果:
四、小结
这个实现中,我们首先去除了前导空格,然后检查了可能的符号位,之后通过一个循环将字符串中的数字字符转换为整数,并在过程中检查是否超过了 32 位整数的范围。注意,我们使用
long
类型来暂存结果,以防止在累加过程中发生溢出,直到最后才将其转换为int
类型并返回。这样做可以确保在转换过程中能够检测到溢出情况,并根据符号返回相应的最大或最小值。
结语
路漫漫其修远兮
吾将上下而求索
!!!