質問8、文字列変換整数(ATOI)

文字列、整数に変換するために8つの質問、

タイトル

あなたが機能を実装するために税引後営業利益、それは文字列を整数に変換することができます。

まず、空白文字で始まります関数は、これまでの最初の非空白文字を見つけるまで、必要であれば無用捨てます。

私たちは、整数の印として、後に連続した数字を上にして、可能な限り、最初の非空白文字が正または負の数であるシンボルのコンビネーションを見つけた場合、最初の非空白文字がある場合連続した数字が整数を形成するために結合された直後の図。

また、余分な文字を存在する可能性がある、有効な整数部分の後の文字列に加えて、これらの文字は無視することができ、彼らは機能に影響はありません。

注:最初の非空白文字の文字列が有効な整数文字列が空でない場合、または空白のみの文字列が含まれている場合、あなたは変換の機能である必要はありません。

いずれにしても、機能が効果的に変換できない場合は、0が返されます。

説明:

我々は、環境が32ビット符号付き整数のサイズは、数値範囲[-231 231--1]を格納することができると仮定する。( - 1 231)またはINT_MIN(-231)の値は、この範囲、清リターンINT_MAXを超えた場合。

例1:
入力: "42"
出力:42

例2:
入力:「-42」
出力:-42
解説:最初の非空白文字が「 - 」、それは負の符号です。
我々は、すべてのデジタル連続で負の数と、後できるだけ合わせ、最終的には-42を取得します。

例3:
入力:「4193の言葉で、」
出力:4193
説明:次の文字が数値ではないので、デジタルOFF「3」に変換。

例4:
入力:「言葉と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