这个题需要注意的是越界的判断,如果不能记住2的31次方的话可以使用pow函数进行计算,然后依次进行字符的读入即可,在计算的时候需要将字符转化为数字进行计算.最后需要与现有的结果和越界值进行比较,如果越界了需要按照题目的要求进行取舍.
class Solution {
public:
int myAtoi(string s) {
// int index = 0;
// while(index < s.length())
// {
// // 让index移动到第一个字符的位置
// if(s[index] != ' ')
// break;
// ++index;
// }
// // 处理正负号
// // 定义标志位默认为1,方便最后的结果判断
// int flag = 1;
// if(s[index] == '+')
// ++index;
// else if(s[index] == '-')
// {
// ++index;
// flag = -1;
// }
// int res = 0;
// // 然后开始处理数字部分
// while(index < s.length())
// {
// // 如果当前的字符不是数字的话就退出循环
// if(s[index] < '0' || s[index] > '9')
// break;
// // 异常处理
// if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (s[index] - '0') > INT_MAX % 10)) {
// return INT_MAX;
// }
// if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (s[index] - '0') > -(INT_MIN % 10))) {
// return INT_MIN;
// }
// // 通过将字符转换为数字并且通过加和的方式对最终的数字进行计算
// res = res * 10 + flag * (s[index] - '0');
// ++index;
// }
// return res;
int index = 0;
long res = 0;
bool flag = true;
// 这里必须使用有符号整数定义,否则不通过,会超出范围或者类型定义不对导致结果为0
// unsigned int MAX = 2147483648; //2^31
unsigned int MAX = pow(2, 31); //2^31
// 直接前导空格
while(s[index] == ' ')
++index;
// 考虑符号
if(s[index] == '-')
{
// flag为假表示负数
flag = false;
++index;
}
// 这里必须是判断,否则会把任意的下一个字符计算进去
else if(s[index] == '+')
++index;
// 读取数字
while(s[index] >= '0' && s[index] <= '9' && res <= MAX)
{
// 这里需要注意拿到的数据是字符,因此需要转换为数字
res = res * 10 + s[index] - '0';
++index;
}
// 考虑如果超出范围怎么办以及正负号的问题,这俩问题可以合二为一处理
if(flag)
res = res > MAX - 1 ? MAX - 1 : res;
else
res = (-1) * (res > MAX ? MAX : res);
return res;
}
};
// class Solution {
// public:
// int myAtoi(string s) {
// const unsigned int MAX = 2147483648;
// int i = 0;
// bool isEegative = false;
// long ans = 0;
// // 跳过前导空格
// while (s[i] == ' ') i++;
// // 检查符号
// if (s[i] == '-') {
// isEegative = true;
// i++;
// } else if (s[i] == '+') {
// i++;
// }
// // 读取数字
// while (s[i] >= '0' && s[i] <= '9' && ans <= MAX) {
// ans = ans * 10 + s[i] - '0';
// i++;
// }
// // 处理整数范围
// if (isEegative) {
// return -1 * (ans > INT32_MAX ? MAX : ans);
// } else {
// return (ans > INT32_MAX ? INT32_MAX : ans);
// }
// }
// };