测试案例:
"+-2" 预期是0
"2.14预期是2"
" +0 123"预期是0
"9223372036854775808"预期是2147483647
"- 234"预期是0
"123-"预期是123
下面是反复根据测试案例最后调试成功,考虑情况太多复杂。不太好。。。
class Solution {
public:
int myAtoi(string str) {
int len = str.size();
if (!len) return 0;
long long res = 0; int flag = 1, sign = 0;
int orderchar = len-1; int ordernum = len-1, orderspace = 0, ordersign = len - 1;
for (int i = 0; i < len; i++){
if (str[i] == '-' || str[i] == '+')
{
sign++;
ordersign = i;
}
int temp = str[i] - '0';
if (temp >= 0 && temp <= 9)
{
res = res * 10 + temp;
ordernum = i;
}
else if (str[i] == ' '){
orderspace = i;
if (orderspace >ordernum)
break;
if (orderspace > ordersign&&orderspace < ordernum)
return 0;
}
else if (str[i] == '+' || str[i] == '-')
{
if (ordernum < ordersign&&sign >= 1)break;
}
else{
orderchar = i;
if (orderchar < ordernum)return 0;
break;
}
if (str[i] == '-')
{
flag = -1;
}
if (sign>1)return 0;
if (res*flag<INT_MIN){
return INT_MIN;
}
else if (res*flag>INT_MAX){
return INT_MAX;
}
}
return res*flag;
}
};
参考
复杂度:
时间 O(n) 空间 O(1)
思路:
字符串题一般考查的都是边界条件、特殊情况的处理。所以遇到此题一定要问清楚各种条件下的输入输出应该是什么样的。这里已知的特殊情况有:
- 能够排除首部的空格,从第一个非空字符开始计算
- 允许数字以正负号(+-)开头
- 遇到非法字符便停止转换,返回当前已经转换的值,如果开头就是非法字符则返回0
- 在转换结果溢出时返回特定值,这里是最大/最小整数
c++ code:
class Solution {
public:
string &trim(string &s){
if (s.empty()) return s;
s.erase(0, s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
return s;
}
public:
int myAtoi(string str) {
long long res = 0; int flag = 1;
str = trim(str);
for (int i = 0; i < str.length(); i++)
{
char c = str[i];
if (i == 0 && (c == '+' || c == '-'))
{
flag = (c == '+' ? 1 : -1);
}
else if (c >= '0'&&c <= '9')
{
//为什么if语句在后面判断,思考
//例如颠倒,最后一位处理完以后将不会检查
//如:-2147483649,2147483648
res *= 10;
res += c - '0';
if (res*flag <= INT_MIN){
return INT_MIN;
}
else if (res*flag >= INT_MAX){
return INT_MAX;
}
}
else
{
return res*flag;
}
}
return res*flag;
}
};