题目描述
解法 逐个元素分析
关键就是要读懂题目要求
1.第一个非空字符必须是数字或者‘+’‘-’号。
2.从第一个非空字符开始直到数字结束就是所求数字。
边界情况:
1.当转换的数字是正数且超过INT 上限,直接转换为INT_MAX。
2.当转换的数字为负数且超过INT 上限,转换为 -INT_MAX,这里要注意负数的绝对值的最大值在补码中比正数大1。
if(ans >= INT_MAX && flag == 1) return INT_MAX;
//注意这里不是大于等于,负数补码的最大绝对值为整数最大值+1
if(ans > INT_MAX && flag == -1) return INT_MIN;
转换过程:
ans初始值为0
ans = ans * 10 + str[i] - ‘0’
比如数字 4231
ans = 0 * 10 + 4 = 4
ans = 4 * 10 + 2 = 42
ans = 42 * 10 + 2 = 423
ans = 423 * 10 + 1 = 4231
class Solution {
public:
int strToInt(string str) {
int flag = 1;
long ans = 0;
int index = 0;
//i停留在第一个不是空格的地方
while(str[index] == ' ') index++;
if(str[index] == '-') {
flag = -1;
index++;
}
else if(str[index] == '+') index ++;
//isdigital函数可以判断字符是不是数字
for(; index < str.size() && isdigit(str[index]); index ++) {
ans = ans*10 + (str[index] - '0');
if(ans >= INT_MAX && flag == 1) return INT_MAX;
//注意这里不是大于等于,负数补码的最大绝对值为整数最大值+1
if(ans > INT_MAX && flag == -1) return INT_MIN;
}
return flag * ans;
}
};
还有几年没用的isdigital函数,可以判断字符是否为数字字符
时间复杂度O(N)
空间复杂度O(1)