【剑指offer】【字符串】67.把字符串转换成整数
题目链接:https://leetcode-cn.com/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/
应该先去除字符串首部的空格,然后再判断正负。
难点在于处理溢出。
INT_MAX 2147483647
INT_MIN -2147483648
- 如果样例中没有超出longlong范围的,可以直接最后判断一下是否超出INT_MAX 和INT_MIN,遍历过程中不用判断(实现一)
- 如果longlong都超出,那就需要遍历过程中进行判断。更严谨(实现2)
第一种 当前number 比 INT_MAX / 10 都大,肯定溢出
第二种情况 当前number == INT_MAX / 10 并且 接下来要加数字x > INT_MAX的个位数 7,也溢出
时间复杂度:O(N) 字符串长度
空间复杂度:O(1)
实现1
class Solution {
public:
int strToInt(string str) {
long long number = 0;
bool is_minus = false;
int k = 0;
//去除首部空格
while (k < str.size() && str[k] == ' ') k ++ ;
//判断正负号
if (str[k] == '+') k ++ ;
else if (str[k] == '-') is_minus = true, k ++ ;
//依次遍历,进行转换
while (k < str.size() && str[k] >= '0' && str[k] <= '9') {
number = number * 10 + str[k] - '0';
k ++ ;
}
//加上符号
if (is_minus) number *= -1;
//判断是否溢出
if (number > INT_MAX) number = INT_MAX;
if (number < INT_MIN) number = INT_MIN;
return (int)number;
}
};
实现2
class Solution {
public:
int strToInt(string str) {
int number = 0;
//是否是负数
bool is_minus = false;
int k = 0;
//去除首部的空格
while (k < str.size() && str[k] == ' ') k ++ ;
//跳过符号位
if (str[k] == '+') k ++ ;
else if (str[k] == '-') is_minus = true, k ++ ;
//依次遍历每个字符 判断每个字符是不是数字0 - 9
while (k < str.size() && str[k] >= '0' && str[k] <= '9')
{
int x = str[k] - '0';
//判断是否越界
if(number > INT_MAX / 10 || (number == INT_MAX / 10 && x > INT_MAX % 10)) return is_minus ? INT_MIN : INT_MAX;
number = number * 10 + x;
k ++ ;
}
return is_minus ? -number : number;
}
};
自己实现
class Solution {
public:
int strToInt(string str) {
int n = str.size();
int k = 0;
while(k < n && str[k] == ' ') k++;
bool flag = false;
if(k < n && str[k] == '-')
{
flag = true;
k++;
}
else if(k < n && str[k] == '+')
k++;
int res = 0;
for(int i = k; i < n; i++)
{
if(str[i] < '0' || str[i] > '9') break;
int val = str[i] - '0';
if((res == INT_MAX / 10 && val > INT_MAX % 10) || res > INT_MAX / 10)
return flag ? INT_MIN : INT_MAX;
res = res * 10 + val;
}
return flag ? -res : res;
}
};
知识的价值不在于占有,而在于使用