這題要我們實作一個將 string 換成 integer 的函數,類似 atoi 的功能。
EX:
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.
想法:
這題非常多有的沒的情況,具體還是去看8. String to Integer (atoi) 給的說明吧。簡而言之這題非常的繁瑣,沒啥特別的技巧,就是要小心注意各種情況 例如:overflow , edge case ex: 0-1, +-2 ... 之類的,這邊就簡單紀錄一下程式碼。
Complexity: O(n) time, O(1) space.
完整程式碼:
class Solution {
public:
int myAtoi(string str) {
if (str.empty()) { return 0; }
int res = 0;
bool flag = false;
int sign = 0;
for (int i = 0; i < str.size(); i++) {
if (str[i] == ' ') {
if (flag || sign != 0) {
return (sign == 0)? res : res * sign;
}
continue;
}
if (str[i] == '-') {
if (flag || sign != 0) {
return (sign == 0)? res : res * sign;
}
sign = -1;
continue;
}
if (str[i] == '+') {
if (flag || sign != 0) {
return (sign == 0)? res : res * sign;
}
sign = 1;
continue;
}
if ((int(str[i]) < 48 || int(str[i]) > 57)) {
return (sign == 0)? res : res * sign;
}
if (sign >= 0 && res > INT_MAX / 10) {
return INT_MAX;
}
if (sign == -1 && res > INT_MAX / 10) {
return INT_MIN;
}
if (res == INT_MAX / 10 && int(str[i] - '0') > 7) {
return (sign == -1)? INT_MIN : INT_MAX;
}
res = res * 10 + (int(str[i]) - '0');
flag = true;
//cout<<res<<endl;
}
return (sign == 0)? res : res * sign;
}
};
沒有留言:
張貼留言