题目
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,qing返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
输入: “42”
输出: 42
示例 2:
输入: " -42"
输出: -42
解释: 第一个非空白字符为 ‘-’, 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:
输入: “4193 with words”
输出: 4193
解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。
示例 4:
输入: “words and 987”
输出: 0
解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。
因此无法执行有效的转换。
示例 5:
输入: “-91283472332”
输出: -2147483648
解释: 数字 “-91283472332” 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。
思路
判断字符串每个字符都是啥,符合条件的先存起来,等待循环完毕之后,先判断是否溢出,如果没有就进行输出,有的话就返回相对应的信息。
注意事项:
1、溢出判断时,不能直接拿整型数进行对比,因为已经溢出了,根本不能进行转换。
2、+ 0 开头的特殊情况注意处理好
3、以-+开头应该返回0而不是继续转换
4、遇到数字或者-号之后就代表转换开始了,遇到其他的字符就代表转换结束。
代码
public class T008 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println( myAtoi( " -11919730356x" ) );
}
public static int myAtoi(String str) {
//暂时以字符串形式存储应该返回的数字
String output = "";
int i = 0;
//开始转换的标记
boolean start = false;
while( i<str.length() ) {
//用来暂存每一个字符,用于接下来的判断
char temp = str.charAt( i );
//判断是否为数字,是就进行相应的操作,并将开始转换标记设置为真
if( temp >= 48 && temp <= 57 ){
//判断字符串开头是否为0(忽略-号),有0就不进行存储了
if( temp == 48 && (output.length()==0 || (output.equals( "-" ) ) ) ) {
start = true;
i++;
}else {
start = true;
output += (temp + "");
i++;
}
//判断是否为负号
}else if( temp == '-' ) {
//当负号是除空格外的字符串的第一个,就进行存储,并将开始转变标记设置为真,否则,就跳出循环
if( !start ) {
output += (temp + "" );
start = true;
i++;
}else
break;
//判断是否为空格,是就进行下一步操作
}else if( temp == ' ' ) {
//如果还没开始转换就,下一个字符串,否则跳出循环
if( !start )
i++;
else
break;
//判断是否为+号
}else if( temp == '+' ) {
//是并且还没开始转换,就开始进行转换,但,并不存储正号,否则跳出循环
if( !start ) {
start = true;
i++;
}else
break;
}else
break;
}
//System.out.println( output );
//判断是否越界了
//当字符串长度大于11的时候无论是正还是负,均已经越界,等于11的时候正数越界,负数(因为有负号,实际数字长度为10)再进行下一步判断
if( output.length() >= 11 ) {
//判断是正还是负,正就直接返回越界的信息,负再进行下一步判断
if( output.charAt(0) == '-' ) {
//判断字符串长度是否等于11是就进行下一步判断,否则返回越界信息
if( output.length() == 11 ) {
//当第一位数字大于2的时候,必定越界,等于2再判断,等于1不越界
if( output.charAt(1) > 50 ) {
return Integer.MIN_VALUE;
}else if( output.charAt(1) == 50 ) {
//等于2的时候再对接下来的几位进行判断,这个时候可以去掉一位可以直接转换为整型数判断大小
//大于147483648越界,否则不越界
if( Integer.parseInt( output.substring(2)) > 147483648 )
return Integer.MIN_VALUE;
}
}else
return Integer.MIN_VALUE;
}else
return Integer.MAX_VALUE;
//长度为10的时候负数必定不越界,正数进行判断,方法同上
}else if( output.length() == 10 ) {
if( output.charAt(0) != '-' ) {
if( output.charAt(0) > 50 ) {
return Integer.MAX_VALUE;
}else if( output.charAt(0) == 50 ) {
if( Integer.parseInt( output.substring(1)) >= 147483647 )
return Integer.MAX_VALUE;
}
}
}
//System.out.println( output );
if( output != "" && !output.equals("-") )
return Integer.parseInt(output);
else
return 0;
}
}