1. 题目
https://leetcode.cn/problems/string-to-integer-atoi/submissions/428764685/
LeetCode 8 是一道字符串转换整数的题目,
考查的是如何处理各种边界情况和异常输入,比如空格、正负号、非数字字符、溢出等
2. 解法
解法思路:
- 首先,使用trim()方法去除字符串s的开头和结尾的空格。
- 然后,判断字符串是否为空,如果为空,就返回0。
- 接着,判断字符串的第一个字符是否是正负号,如果是,就记录下符号,并将索引index加一,跳过这个字符。如果不是,就默认为正号。
- 然后,使用一个循环遍历字符串的剩余字符,每次取出一个字符c,并进行以下操作:
- 判断c是否是数字,如果不是,就跳出循环,结束转换。
- 判断当前的结果result是否会溢出整数范围,如果是,就根据符号返回最大值或最小值。
- 将c转换为数字,并将result乘以10再加上c,得到新的结果。
- 将索引index加一,继续下一个字符。
- 最后,将结果result乘以符号sign,并返回。
具体实现
class Solution { public int myAtoi(String s) { // 去除空格 s = s.trim(); // 判断是否为空 if (s.length() == 0) { return 0; } // 判断正负号 int sign = 1; int index = 0; if (s.charAt(0) == '+') { index++; } else if (s.charAt(0) == '-') { sign = -1; index++; } // 转换数字 int result = 0; while (index < s.length()) { char c = s.charAt(index); // 判断是否为数字 if (c < '0' || c > '9') { break; } // 判断是否溢出 if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && c - '0' > Integer.MAX_VALUE % 10)) { return sign > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE; } // 累加数字 result = result * 10 + (c - '0'); index++; } // 返回结果 return sign * result; } }
3. 总结