字符串转换整数 (atoi)
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
提示:
本题中的空白字符只包括空格字符 ’ ’ 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-integer-atoi
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题其实思路比较简单,就是对字符串的处理。我感觉这道算法本来想考验字符处理的。但是很多函数我知道,那不能当做不知道呀。我基本上使用Java自己的API来实现各种处理的。好了分析题目
1 字符串转整数: 第一时间想到的是Integer.parseInt(str)
2 丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止: 去掉两端空格 str = str.trim()
3. 第一个字符+或-或数字: 因为我已经去掉了两端的空格: str.charAt(0)
取str的第一个字符串判断
4.根据题目分析除了第一个可以是+或-外,符号位后接的为必须是数字 判断数字没想到好的办法,我是将0,910个数字全部写到if里面去判断的,通过遍历str.charAt(i)
取第i位的字符串
5.如果找不到有效数字(都是字符)返回0
6.溢出判断,大于int的最大值就输出int的的最大值Integer.MAX_VALUE
,小于最小值输出Integer.MIN_VALUE
,我这个是过 捕获异常实现的。我觉得我这种做法有点小机智,哈哈哈。不用去判断位数,写一堆算法去实现
try{
return Integer.parseInt(str);
//能捕获到异常,说明溢出了
}catch (NumberFormatException e){
//如果符号位是负数,返回最小值,否则返回最大值
if (str.charAt(0) == '-')
return Integer.MIN_VALUE;
return Integer.MAX_VALUE;
}
全部源码(我写了注释,应该还比较好理解):
class Solution {
public int myAtoi(String str) {
//空字符直接返回0,免得空指针异常
if (str==null) return 0;
//先把空格去掉
str = str.trim();
//计算数组长度,如果长度为0,直接返回0
int strLength = str.length();
if (strLength==0) return 0;
//这个是有效的长度,计算我要的那个数据有多长
int intLength = 0;
//是否有符号
int sign=0;
//首字母是(如果首字母是+或者-符号位是0,如果是数组开头,就是0)
//+-符号也占用有效长度的位数
if ((str.charAt(0) =='-') || (str.charAt(0) =='+')){
intLength++;
sign = 1;
}
//我前面判断了是否有符号位,如果有,那么charAt(0)肯定是符号位,所有我从sign位开始判断,有符号sign=1,没有sign=0
for (int i = sign; i < strLength; i++){
//正则表达的是没学好,强行判断0-9(如果要判断A-Z我估计得吐血) 短路或 ||
//如果是 0-9有效数字,有效长度+1
if ((str.charAt(i) =='1') || (str.charAt(i) =='2') || (str.charAt(i) =='3') || (str.charAt(i) =='4') || (str.charAt(i) =='5') || (str.charAt(i) =='6') || (str.charAt(i) =='7') || (str.charAt(i) =='8') || (str.charAt(i) =='9') || (str.charAt(i) =='0')){
intLength++;
}else break; //碰到第一个非有效数字的字符就跳出循环
}
//通过上面的循环我们已经将str里面的有效长度取出来了
//如果没有有效数字,直接返回0
if (intLength ==0) return 0;
//再次裁剪,现在str生效的都是有效位了
str = str.substring(0,intLength);
//有符号且只有一位,说明仅仅是有个正负符号,返回0
if (str.charAt(0) == '-' || str.charAt(0) == '+'){
if (str.length() == 1) return 0;
}
//接下来的就是正常的string转int,直接调用函数
try{
return Integer.parseInt(str);
}catch (NumberFormatException e){
if (str.charAt(0) == '-')
return Integer.MIN_VALUE;
return Integer.MAX_VALUE;
}
}
}
君不见,黄河之水天上来,本来到海不复还
博主:五更依旧朝花落