題目;
首先,該函數會根據需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符爲止。
當我們尋找到的第一個非空字符爲正或者負號時,則將該符號與之後面儘可能多的連續數字組合起來,作爲該整數的正負號;假如第一個非空字符是數字,則直接將其與之後連續的數字字符組合起來,形成整數。
該字符串除了有效的整數部分之後也可能會存在多餘的字符,這些字符可以被忽略,它們對於函數不應該造成影響。
注意:假如該字符串中的第一個非空格字符不是一個有效整數字符、字符串爲空或字符串僅包含空白字符時,則你的函數不需要進行轉換。在任何情況下,若函數不能進行有效的轉換時,請返回 0。
說明:
假設我們的環境只能存儲 32 位大小的有符號整數,那麼其數值範圍爲 [−231, 231 − 1]。如果數值超過這個範圍,qing返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
輸入: “42” 輸出: 42
示例 2:
輸入: " -42" 輸出: -42
示例 3:
輸入: “4193 with words” 輸出: 4193
示例 4:
輸入: “words and 987” 輸出: 0
示例 5:
輸入: “-91283472332” 輸出: -2147483648 解釋: 數字 “-91283472332” 超過 32 位有符號整數範圍。 因此返回 INT_MIN (-2^31) 。
思路:
先找到第一個非空字符,然後判斷是否爲數字或’+‘或’-’,然後除去數字串前面的所有0!!!
使用flag來表示正負號;使用一個vecotr存儲數字
使用vector最後拼接成一個數
代碼:
class Solution {
public:
int myAtoi(string str) {
//思路:先找到第一個非空字符,然後判斷是否爲數字或'+'或'-',然後除去數字串前面的所有0!!!
//使用flag來表示正負號;使用一個vecotr<int>存儲數字
//使用vector最後拼接成一個數
//特殊情況 ""
if(str.length() == 0)
return 0;
int i,j; //獲取第一個非空字符
bool flag = 0; //表示正數
for(i=0; i< str.length(); i++)
if(str[i] != ' ')
break;
//判斷
if(( (str[i] < '0') || (str[i] > '9') ) && (str[i] != '+') && (str[i] != '-') )
return 0;
else if(str[i] == '-')
{
flag = 1;
i++;
}
else if(str[i] == '+')
i++;
//當開始是0時!!!
while(str[i]== '0')
i++;
cout<<i<<endl;
vector<int> a;
for(j=i; (j < str.length()) && ((str[j] >= '0') && (str[j] <= '9')); j++)
a.push_back(str[j]-48);
//將vector中的數字拼接成一個數
j = a.size();
if(j>10)
{
if(flag == 0) //表示正數
return INT_MAX;
else
return -2147483648;
}
else if(j == 0)
return 0;
else
{
//由於可能出現大於32位的數,所以用long
long ret = 0;
for(i = 0; i < j ; i++)
ret += a[i] * pow(10, j - 1 - i);
if(flag == 0) //表示正數
{
if(ret > INT_MAX)
return INT_MAX;
return ret;
}
else
{
if(ret > 2147483648) //最小值
return -2147483648;
return (int)(0 - ret);
}
}
}
};