乘风破浪:LeetCode真题_008_String to Integer (atoi)

时间:2023-03-10 00:14:25
乘风破浪:LeetCode真题_008_String to Integer (atoi)

乘风破浪:LeetCode真题_008_String to Integer (atoi)

一、前言

将整型转换成字符串,或者将字符串转换成整型,是经常出现的,也是必要的,因此我们需要熟练的掌握,当然也有很多工具来实现了,但是在这个基础上加入一些其他的因素就是考点的所在了。

二、String to Integer (atoi)

2.1 问题理解

乘风破浪:LeetCode真题_008_String to Integer (atoi)

乘风破浪:LeetCode真题_008_String to Integer (atoi)

乘风破浪:LeetCode真题_008_String to Integer (atoi)

2.2 问题分析和解决

    看到这个问题,我们就需要遍历字符串,然后判断开始的时候是不是空格,+,-,或者数字,如果不是的话就是不合理的,如果是,则继续向后遍历,直至遇到其他字符为止,将这之间的内容保存下来,并且转换成整型数据。如果发现大于整型的范围则根据正负返回相应的结果。

    我们的代码:

 public class Solution {

     public int myAtoi(String str) {

         if (str == null || str.length() == 0) {
return 0;
} // 如果字符串以空格开始
int start = 0; //从开始找第一个不是空格的数
boolean positive = true; // 是否为正数默认为true if (str.charAt(start) == ' ') {
while (str.charAt(start) == ' ') {
start++;
if (start >= str.length()) { // 输入的全是空格
return 0;
}
}
} if (str.charAt(start) == '-') { // 第一个非空白字符中-
positive = false;
start++;
} else if (str.charAt(start) == '+') {// 第一个非空白字符是+
start++;
} else if (str.charAt(start) >= '0' && str.charAt(start) <= '9') { // 第一个非空白字符是数字
return cal(str, start, true);
} else { // 其它情况就抛出异常
return 0;
} if (start >= str.length()) { // 第一个非空白字符是+或者-但也是最后一个字符
return 0;
} if (str.charAt(start) > '9' || str.charAt(start) < '0') { // +或者-后面接的不是数字
return 0;
} else {
return cal(str, start, positive);
}
} private int cal(String str, int start, boolean positive) { long result = 0;
while (start < str.length() && str.charAt(start) >= '0' && str.charAt(start) <= '9') {
result = result * 10 + (str.charAt(start) - '0'); if (positive) { // 如果是正数
if (result > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
} else {
if (-result < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
} start++;
} if (positive) {
return (int) result;
} else {
return (int) -result;
}
}
}

三、总结

通过这样的实践,使得我们对于一些细节上的东西有了更深刻的认识,比如越界问题,比如正负号问题,以及正负号之后是不是数字,空格等等的解决方法。