题8、 字符串转换整数 (atoi)

题8、 字符串转换整数

题目

请你来实现一个 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;
        
    }

}
发布了25 篇原创文章 · 获赞 0 · 访问量 126

猜你喜欢

转载自blog.csdn.net/weixin_45980031/article/details/103465939