8. String to Integer (atoi)

8. String to Integer (atoi)

題目

將字符串轉換爲整數。

1.首先將遇到的空格捨棄,直到遇到首個非空字符。
2.然後,選擇正負號,將字符串翻譯成數值。
字符串可以包含構成整數的字符之後的其他字符,這些字符被忽略,對函數沒有影響。
Input: “4193 with words”
Output: 4193

3.如果str中的非空字符的第一個序列不是一個有效的整數,或者如果沒有這樣的序列存在,當str是空的,或者它只包含空白字符,那麼就不會執行轉換。

如果沒有有效的轉換,就返回零。
Input: “words and 987”
Output: 0
4.如果越界,返回邊界值(2147483647或-2147483648)
int是32bit,範圍 [−231, 231− 1]
INT_MAX (231− 1) or INT_MIN (−231) is returned.

Input: “-91283472332”
Output: -2147483648

代碼塊

class Solution {
    public int myAtoi(String str) {
        if(str.length() == 0|| str == null)
            return 0;

        int sign = 1;
        int index = 0;
        long result = 0;

        while(index < str.length() && str.charAt(index) == ' '){//當全爲空的時候,index=str.length(),下面的if和for就都不會執行了.
                index ++;
        }
        if(index < str.length()){//加一個大條件
                if(str.charAt(index) == '-'){
                    sign = -1;
                    index ++;
            }else if(str.charAt(index) == '+'){
                index ++;
            }
        }

        for(int j = index; j < str.length(); j++){
            if(str.charAt(j) >= '0' && str.charAt(j) <= '9'){
                result = result *10 + str.charAt(j) - '0';
                 if(result > java.lang.Integer.MAX_VALUE){
                    return  sign <0 ?(java.lang.Integer.MIN_VALUE):(java.lang.Integer.MAX_VALUE);
                // if(result > java.lang.Long.MAX_VALUE){
                //     return (int)( ***sign<'0'***?(java.lang.Long.MIN_VALUE):(java.lang.Long.MAX_VALUE));    sign是int型,不加引號。
                }
            }else{
                break;
            }
        }
        result *= sign;
        return (int)result;
    }

public static void main(String[] args) {
        //String str =  "2147483648";
        String str =  " 1";
        System.out.println(myAtoi(str));
    }
}

代碼分析

本題需要考慮幾種情況:
1. 如果爲空或者長度爲零時,返回0;
str=null 說明str沒有指向任何對象 ;而str長度爲零時str肯定不爲null的,此時str指向一個長度爲零的字符串。
2. 如果遇到空格就將索引往後移;(while)
3. 判斷符號;(是正是負)
4. 判斷數字是否在0-9;再判斷數值是否越界
5. 將數值乘字符表示出來。

本題的條件二(while)控制了str全爲空的情況,當全爲空的時候,index=str.length(),下面的if和for就都不會執行了。
java.lang.Integer.MAX_VALUE 表示Java中int型最大值。

空格的ASCII爲32;’0’的ASCII碼爲48。



Figure 1. ASCII

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章