String to Integer (atoi) 字符串转数字
String to Integer (atoi) 字符串转数字
原题地址 主要的难点在于溢出的判断 判断依据: 将极值去掉最后一位(也就是除以10) 来判断,如果数字已经比这个去掉个位的数字要大的话,添上最后一位必会溢出,如果等于的话,比较极值的个位数字与即将添加到个位的数字进行比较,后者大也必定会溢出,否则不会溢出
时间复杂度:O(n) 空间复杂度:O(1)
int myAtoi(string str) {
if (str.empty()) return 0;
bool isMinus=false;
int pos=0;
// 跳过空格
while(str[pos] == ' ') ++pos;
// 正负号检查与跳过
if (str[pos] == '-' || str[pos] == '+')
if (str[pos++] == '-') isMinus = true;
int number=0;
static int ma = INT_MAX/10;
static int ma_l = INT_MAX%10;
static int mi = (unsigned)INT_MIN/10;
static int mi_l = (unsigned)INT_MIN%10;
// 开始进行转换
while(str[pos] >= '0' && str[pos]<='9') {
int c = str[pos++]-'0';
// 分别判断上溢和下溢
if (!isMinus && (number > ma || (number == ma && c>ma_l))) {
return INT_MAX;
}
else if
(isMinus && (number > mi || (number == mi && c > mi_l)))
{
return INT_MIN;
}
number = 10*number + c;
}
return isMinus ? -number : number;
}如果不想这样判断的话也可以直接用 long 类型来存放 number ,然后直接比较它与 INT_MAX 和 INT_MIN 的大小关系即可
收获
INT_MIN和INT_MAX两个宏定义在#include<bits/stdc++.h>里可以找到- 如何判断溢出
#overflow