题解 | #把字符串转换成整数(atoi)# 超易理解
把字符串转换成整数(atoi)
https://www.nowcoder.com/practice/d11471c3bf2d40f38b66bb12785df47f
#include <climits> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ int StrToInt(string s) { // write code here int result = 0; bool isReachNum = false; //判断是否开始转换了 bool neg = false; //判断正负 for (auto ch : s) { if (ch == ' ' && !isReachNum) // 如果遇到空格,并且还没有开始转换就不管这个空格 continue; if (ch == '-' && !isReachNum) { // 碰到负号,并且还没有开始转换,就当作负数了,并且现在就开始转换了。 isReachNum = true; neg = true; continue; } if (ch == '+' && !isReachNum) { // 碰到正号并且还没有开始转换,就当作正数了,并且现在开始转换了。 isReachNum = true; continue; } if (!(ch <= '9' && ch >= '0')) // 处理了正数和负数还有空格的场景,剩下碰到不是数字的直接retrun,空格的场景在最上面已经过滤了,剩下的只有是“空格+已经开始转换”。这个时候一定是异常了。 return result * (neg ? -1 : 1); if (ch <= '9' && ch >= '0') { //先设置为开始转换 isReachNum = true; if (!isLargeThanMax(result, ch, neg)) // 不是大数继续算 result = result * 10 + ch - '0'; else // 大数直接溜 return neg ? INT_MIN : INT_MAX; } } return result * (neg ? -1 : 1); } bool isLargeThanMax(int result, char ch, bool neg) { if (result > INT_MAX / 10 || (result == INT_MAX / 10 && ch - '0' > INT_MAX % 10)) { // 1. 如果result > INT_MAX / 10 表示大数,因为它再乘以10,一定大于最大数。 // 2. 如果reulst == INT_MAX / 10时,只有当ch - '0' > INT_MAX % 10(也就是8)才表示大数。 return true; } return false; } };