描述
这是一篇针对初学者的题解。题解针对atoi()的实现,不限于本题。
知识点:字符串,边界考察
难度:二星
题解
题目意思很明确,这道题难就难在边界的考察。如果对于一般规则的数字“字符串”转化为数字都很容易,比如:
对于“123456”可以利用如下代码进行转化:
int ans = 0; for (int i=0; i<str.size(); ++i) { ans = ans * 10 + (str[i] - '0'); }
int的范围为
如果超过了这两个范围该怎么办?
其实也很简单,首先判断这个数的正负,如果正数,超过了INT_MAX,就设置为INT_MAX,如果是负数,首先我们不考虑负号,如果超过了INT_MAX+1, 则就置为INT_MAX+1, 最后再根据正负号,来加负号。
代码如下:
bool neg = str[i]=='-' ? true : false; i = isdigit(str[i]) ? i : i+1; long long ans = 0L; // 因为INT_MAX+1超过了int的范围 while (i < len && isdigit(str[i])) { ans = ans * 10 + (str[i++]-'0'); if (!neg && ans > INT_MAX) { ans = INT_MAX; break; //因为此处以为最大值,所以直接break } if (neg && ans > 1L + INT_MAX) { ans = 1L + INT_MAX; break; } }
最后再考虑一些特殊情况即可。
代码如下:
class Solution { public: int StrToInt(string str) { const int len = str.length(); if (len == 0) return 0; int i = 0; while (i < len && str[i] == ' ') { ++i; } // 排除开头的空格 if (i == len) return 0; if (!isdigit(str[i]) && str[i] != '+' && str[i] != '-') return 0; bool neg = str[i]=='-' ? true : false; i = isdigit(str[i]) ? i : i+1; long long ans = 0L; while (i < len && isdigit(str[i])) { ans = ans * 10 + (str[i++]-'0'); if (!neg && ans > INT_MAX) { ans = INT_MAX; break; } if (neg && ans > 1L + INT_MAX) { ans = 1L + INT_MAX; break; } } if (i != len) return 0; // 不要此处,就是atoi()库函数的实现 return !neg ? static_cast<int>(ans) : static_cast<int>(-ans); } };
但是本题有个样例:
感觉很无语。
时间复杂度:O(N)
空间复杂度:O(1)