剑指offer 把字符串转换成整数 C++11
把字符串转换成整数
https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId=13&tqId=11202&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking
把字符串转换成整数
题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。
数值为0或者字符串不是一个合法的数值则返回0。输入描述:
输入一个字符串,包括数字字母符号,可以为空。输出描述:
如果是合法的数值表达则返回该数字,否则返回0。*注意:越界情况需要讨论 -2147483649 否则case通过率为85.71% *
负数最小值不管是否取负号是相等的。
cout<<(-(0x7FFFFFFF + 1) == (0x7FFFFFFF + 1)) <<endl; // 1
完整代码,我觉得思路很清晰。
class Solution { public: int StrToInt(string str) { int res = 0; int len = str.size(); int index = 0; //str索引 int flag = true; //默认为正数 // 处理空格 while(str[index] == ' ') index++; // 处理首位 if(str[index] == '+') flag = true; else if(str[index] == '-') flag = false; else if(str[index] >= '0' && str[index] <= '9') res += str[index] & 0xF; // ASCII,等价于 - '0'操作 else return 0; index++; // 接着处理 while(index < len){ if(!(str[index] >= '0' && str[index] <= '9')) return 0; char tmp = str[index] - '0'; if(index + 1 == len) // 边界情况!!! if (res > 0 && (res * 10 + 7 == 0x7FFFFFFF)) if((flag && tmp > 7) || (!flag && tmp > 8)) return 0; res = (res<<1) + (res<<3) + tmp; // 左移1位相当于×2 index++; } return flag? res: -res; } };