1. 程式人生 > >演算法設計與分析課作業【week6】leetcode--8. String to Integer (atoi)

演算法設計與分析課作業【week6】leetcode--8. String to Integer (atoi)

題目

Implement atoi which converts a string to an integer.

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.

The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.

If no valid conversion could be performed, a zero value is returned.

Note:

  • Only the space character ' ' is considered as whitespace character.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31,  2^31 − 1]. If the numerical value is out of the range of representable values, INT_MAX (2^31 − 1) or INT_MIN (−2^31) is returned.

Example 1:

Input: "42"
Output: 42

Example 2:

Input: "   -42"
Output: -42
Explanation: The first non-whitespace character is '-', which is the minus sign.
             Then take as many numerical digits as possible, which gets 42.

Example 3:

Input: "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.

Example 4:

Input: "words and 987"
Output: 0
Explanation: The first non-whitespace character is 'w', which is not a numerical 
             digit or a +/- sign. Therefore no valid conversion could be performed.

Example 5:

Input: "-91283472332"
Output: -2147483648
Explanation: The number "-91283472332" is out of the range of a 32-bit signed integer.
             Thefore INT_MIN (−231) is returned.

題目的要求是從一個字串中讀取數值,從頭開始,碰到第一個非空字元時讀取數值,讀到非數字時停止(第一個字元正負符號除外)。

那麼我們可以首先除去字串剛開始的空字元,再來讀取字元,這裡我們需要注意以下情況:

  1. 如果遇到'+'、'-'符號,可以讀取,但要注意只能讀取一次。如"+-1",這個是錯誤的,而且只能在第一個讀取,如果出現"1544+54",在讀到'+'號就需要停止了。 
  2. 遇到非數字則停止讀取。
  3. 根據題目要求,在讀取數字時需要注意數字的大小,超過INT_MAX或者小於INT_MIX則可以停止讀取了。

C++程式碼如下:

class Solution {
public:
    int myAtoi(string str) {
        /* negative用來記錄數值正負,
           start用來判斷確定已經開始讀取數值,避免"12+13"的讀取錯誤情況。*/
        bool negetive = false, start = false;
        int result = 0, i = 0;
        
        //首先除去空白字元
        while (str[i] == ' ') 
            ++i;
       
        for ( ; i < str.length(); ++i) {
            if (!start && (str[i] == '-' || str[i] == '+')) {
                negetive = str[i] == '-' ? true : false;
                start = true;
            }
            else if (str[i] <= '9' && str[i] >= '0') {
                start = true;
                
                //判斷數值大小可否超過限定最大最小數值
                if (result > INT_MAX / 10|| result == INT_MAX / 10 && (str[i] - 48) > INT_MAX % 10)
                    return negetive ? INT_MIN : INT_MAX;
                result = result * 10 + str[i] - 48; 
            }
            else 
                break;
        }
        return negetive ? -result : result;
    }
};