这个问题看起来很简单,但实际上包含了一些复杂的细节。主要需要注意的是处理负号、空格、无效字符等特殊情况。下面是一个可能的解决方案:
首先检查输入字符串是否为空或只有空格,如果是则直接返回0。
然后从第一个非空字符开始查找有效的数字字符。如果找到的有效数字字符前没有加号或减号,说明整个字符串都是正数。如果找到的第一个有效数字字符前有一个减号,说明整个字符串是负数。如果找到的第一个有效数字字符前有一个加号,这个加号会被忽略,因为正数不需要表示。
接着把找到的所有有效的数字字符转换为整数,根据之前是否有负号来决定最终的结果是正数还是负数。
最后还需要处理一些边界情况,比如如果字符串里只有加号或减号,或者是多个加号或减号相连。
以下是具体的Java代码:
class Solution {
public int myAtoi(String str) {
if (str.isEmpty() || str.trim().isEmpty()) return 0;
boolean negative = false;
long result = 0;
int start = 0;
// 去除开头的空白字符
for (; start < str.length(); ++start) {
char c = str.charAt(start);
if (c != ' ') break;
}
// 处理正负号
if (start < str.length()) {
char sign = str.charAt(start);
if (sign == '+' || sign == '-') {
negative = sign == '-';
++start;
}
}
// 转换数字部分
for (; start < str.length(); ++start) {
char c = str.charAt(start);
if (c < '0' || c > '9') break;
long digit = c - '0';
// 检查是否溢出
if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && digit > 7)) {
return negative ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
result = result * 10 + digit;
}
// 返回结果,注意处理负号
return (int) (negative ? -result : result);
}
}
例如,对于输入字符串 " -42",输出应为-42。对于输入字符串 "4193 with words",输出应为4193。对于输入字符串 "words and 987",输出应为0。对于输入字符串 "-91283472332",输出应为-2147483648。