1. 程式人生 > >Leet Code OJ 8. String to Integer (atoi) [Difficulty: Easy]

Leet Code OJ 8. String to Integer (atoi) [Difficulty: Easy]

題目描述:

將一個字串轉換成一個整數,要求不能使用字串轉換整數的庫函式atoi()。

輸入:

輸入可能包含多個測試樣例。

對於每個測試案例,輸入為一個合法或者非法的字串,代表一個整數n(1<= n<=18446744073709551617)。

輸出:

對應每個測試案例,

若輸入為一個格式合法的字串(即恰好表示一個整數),則輸出這個整數;

若輸入為一個合法的字串,但中間出現了數字、+、-以外的特殊字元,則輸出第一個特殊字元之前的整數;

若輸入為一個格式非法的字串,則輸出0;

若輸入的數格式合法,但超出INT_MIN或INT_MAX,如果為正數輸出INT_MAX,如果為負數則輸出INT_MIN .

樣例輸入:

"+8"(省略+號輸出)

"1314"
"-123456"
"1ab3"
"    010";(注意有0的時候,輸出的時候是省略的)
"13  456"
"-66666666666"

"9223372036854775807"
"18446744073709551617"
"- +899999"
"   - 321"
"   +0 123"

樣例輸出:

8

1314
-123456
1
10
13
-2147483648
2147483647

2147483647

0

0

0

-------------------------------------------------------------------------------------------------------------------------------------------------------------

程式碼:

class Solution {
    public int myAtoi(String str) {
        char[] charArr=str.toCharArray();
        Long result=0L;
        int startIndex=0;
        boolean flag=true;//正數

        for(int i=0;i<charArr.length;i++){
            if(startIndex==i){
                if(charArr[i]==' '){
                    startIndex++;
                    continue;
                }
                if(charArr[i]=='+'||charArr[i]=='0'){
                    continue;
                }
                if(charArr[i]=='-'){
                    flag=false;
                    continue;
                }
            }
            if(charArr[i]>='0'&&charArr[i]<='9'){
                result=result*10+charArr[i]-'0';

                if( result > Integer.MAX_VALUE)
                {
            		 if(flag)
         	        {
         	          result = (long) Integer.MAX_VALUE;
         	        }
                    break;
                }
            }else{
                break;
            }
        }
        
        if(!flag)
        { 
        	if(result > Integer.MAX_VALUE)
        	{
        		result = (long) Integer.MAX_VALUE + 1;
        	}
        	
        	result = - result;
        }
        
        return result.intValue();
    }
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------

學習的內容:

1.string轉char【】:char[] charArr=str.toCharArray();

2.如何表示int的最大數和最小數Integer.MAX_VALUE && Integer.MIN_VALUE;

3.判斷是否超過 [−2^31,  2^31 − 1]這個範圍,也是判斷是否超過了int,可以用long最為邊界。 

  要注意初始化:Long result=0L;

4. 要注意,計算int 的結果時,不能 result=result*10+charArr[i];charArrr【i】是char型別,要想得到‘0’ - ‘9’ 的數值,要使用下面的形式:result=result*10+charArr[i]-'0';

5.提供返回結果的時候:return result.intValue(); 要注意result是個long。

6.不能用 if(length>10){ break; } 判斷是否越界,會出錯,如圖:

主要是因為,if(charArr[i]>='0'&&charArr[i]<='9')中,等於0也會計入長度length中,所以這時的length>10,不準了。

但是如果你去掉if中等於0的這個等號,也會存在問題,因為32023中的0也同樣沒法識別。因此不採用這種判斷越界的辦法,

我想出的一種辦法,在上面。大家可以參考下。

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------

( 參考了他的主要部分,但是他的程式碼部分有問題)

(參考了 他的題目描述)