實現 atoi
,將字符串轉為整數。
該函數首先根據需要丟棄任意多的空格字符,直到找到第一個非空格字符為止。如果第一個非空字符是正號或負號,選取該符號,并將其與后面盡可能多的連續的數字組合起來,這部分字符即為整數的值。如果第一個非空字符是數字,則直接將其與之后連續的數字字符組合起來,形成整數。
字符串可以在形成整數的字符后面包括多余的字符,這些字符可以被忽略,它們對于函數沒有影響。
當字符串中的第一個非空字符序列不是個有效的整數;或字符串為空;或字符串僅包含空白字符時,則不進行轉換。
若函數不能執行有效的轉換,返回 0。
說明:
假設我們的環境只能存儲 32 位有符號整數,其數值范圍是?[?231,? 231?? 1]。如果數值超過可表示的范圍,則返回 ?INT_MAX (231?? 1) 或?INT_MIN (?231) 。
示例?1:
輸入: "42" 輸出: 42
示例?2:
輸入: " -42" 輸出: -42 解釋: 第一個非空白字符為 '-', 它是一個負號。我們盡可能將負號與后面所有連續出現的數字組合起來,最后得到 -42 。
示例?3:
輸入: "4193 with words" 輸出: 4193 解釋: 轉換截止于數字 '3' ,因為它的下一個字符不為數字。
示例?4:
輸入: "words and 987" 輸出: 0 解釋: 第一個非空字符是 'w', 但它不是數字或正、負號。因此無法執行有效的轉換。
示例?5:
輸入: "-91283472332" 輸出: -2147483648 解釋: 數字 "-91283472332" 超過 32 位有符號整數范圍。 因此返回 INT_MIN
解答:
1 int myAtoi(string str) { 2 int res = 0; 3 int flag = 1; 4 int i = 0; 5 while(str[i] == ' ' && i < str.size()) 6 ++i; 7 if(i < str.size()) 8 { 9 if(str[i] == '-') 10 { 11 flag = -1; 12 i++; 13 } 14 else if(str[i] == '+') 15 i++; 16 else if(str[i] < '0' || str[i] > '9') 17 return 0; 18 for(; i < str.size(); ++i) 19 { 20 if(str[i] < '0' || str[i] > '9') 21 break; 22 if(res > INT_MAX / 10 || (res == INT_MAX/10 && str[i] - '0' > INT_MAX %10)) 23 return flag > 0 ? INT_MAX : INT_MIN; 24 res = res * 10 + str[i] - '0'; 25 } 26 27 } 28 return res * flag; 29 }
?