1. 程式人生 > >LeetCode——8. String to Integer (atoi)

LeetCode——8. String to Integer (atoi)

1.題目詳情

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: [−231, 231 − 1]. If the numerical value is out of the range of representable values, INT_MAX (231
    − 1) or INT_MIN (−231) 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.

輸入一個字串,轉換為數字輸出。首先忽略前面所有的空格,然後可以接受一個"加號"或"減號",之後就儘可能的接受數字字元,將這些接受的字元轉換為數字。

如果接受的字元個數為0或者只有符號位(即正負號),輸出0;如果數字不在[-232, 232-1]的範圍,則輸出232-1或者-232

2.解題方法

class Solution {
public:
    int myAtoi(string str) {
        int result = 0;
        bool isPositive = true;
        int size = str.size();
        int index = 0;
        // 去除字串前面的空格
        while (index < size && str[index] == ' ')
        	index++;
        // 考慮除去空格後第一個字元的影響
        char c = str[index];
        if (c == '-'){		// 如果是'-',則將isPositive標記為false,表示結果應該是負數
        	index = index + 1;
        	isPositive = false;
        }
        else if (c == '+'){	// 如果是'+',則將isPositive標記為true,表示結果應該是正數
        	index = index + 1;
        	isPositive = true;
        }
        else if (c > 57 || c < 48)	// 如果不是數字符號,則說明接受的字元個數為0,輸出0
        	return 0;
        // 儘可能接受接下來的字元,用於轉換成數字
        while (index < size) {
        	char c = str[index];
        	if (c > 47 && c < 58) {
        		int num = c - 48;
        		// 如果越界了,而且isPositive標記位為true,則返回INT_MAX
        		if (isPositive && (2147483647 / 10 < result || result == 214748364 && num > 7))
        			return 2147483647;
        		// 如果越界了,而且isPositive標記位為false,則返回INT_MIN
        		if (isPositive == false && (2147483648 / 10 < result || result == 214748364 && num > 8))
        			return -2147483648;
        		result = result * 10 + num;
        	}
        	else
        		break;
        	index = index + 1;
        }
        // 最後以標記位和接受的字元返回結果
        return isPositive ? result : 0 - result;
    }
};