题目
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。
函数 myAtoi(string s) 的算法如下:
- 空格: 读入字符串并丢弃无用的前导空格(
" ") - 符号: 检查下一个字符(假设还未到字符末尾)为
'-'还是'+'。如果两者都不存在,则假定结果为正。 - 转换: 通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
- 舍入: 如果整数数超过 32 位有符号整数范围
[−2^31, 2^31 − 1],需要截断这个整数,使其保持在这个范围内。具体来说,小于−2^31的整数应该被舍入为−2^31,大于2^31 − 1的整数应该被舍入为2^31 − 1。
返回整数作为最终结果。
题解
方式一:模拟
public int myAtoi(String s) {
int result = 0;
// 丢弃前导空格
s = s.trim();
// 检查符号
boolean positive = true;
if (s.startsWith("-")) {
positive = false;
s = s.substring(1);
} else if (s.startsWith("+")) {
positive = true;
s = s.substring(1);
}
// 转换
// 越界问题还可以比较 Integer.MAX_VALUE/10和Integer.MAX_VALUE%10
StringBuilder sb = new StringBuilder();
boolean startZero = true;
for (char c: s.toCharArray()) {
if (!Character.isDigit(c)) {
break;
}
if (startZero && c == '0') {
continue;
}
startZero = false;
sb.append(c);
if (sb.length() > 0 && positive && Long.parseLong(sb.toString()) >= Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
if (sb.length() > 0 && !positive && -Long.parseLong(sb.toString()) <= Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
}
if (sb.length() > 0) {
if (positive) {
result += Integer.parseInt(sb.toString());
} else {
result -= Integer.parseInt(sb.toString());
}
}
return result;
}
总结
算法:模拟