剑指offer49_把字符串转换成整数_题解
把字符串转换成整数
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
示例1
输入
"+2147483647"
返回值
2147483647
示例1
输入
"1a33"
返回值
0
分析
方案一:遍历
根据题意,有以下四种字符需要考虑:
- 首部空格: 删除之即可;
- 符号位: 三种情况,即 ''+'' , ''−'' , ''无符号" ;新建一个变量保存符号位,返回前判断正负即可。
- 非数字字符: 遇到首个非数字的字符时,应立即返回。
- 数字字符:
- 字符转数字:\(str[i]-'0'\)
- 数字拼接:\(ans=ans*10+(str[i]-'0')\)
此外,还需要考虑数字越界,正数越界返回 \(INT\_MAX\),负数越界返回 \(INT\_MIN\)
代码
/**
1.时间复杂度:O(n)
2.空间复杂度:O(n)
**/
class Solution
{
public:
int StrToInt(string str)
{
int len = str.length();
if (len == 0) // 如果字符串为空串,返回0
return 0;
int i = 0;
while (i < len && str[i] == ' ') // 寻找第一个非空字符
++i;
if (i == len) // 如果字符串中的字符全为空格,则返回0
return 0;
if (!isdigit(str[i]) && str[i] != '+' && str[i] != '-') // 如果第一个非空字符不是数字也不是正负号,则返回0
return 0;
bool symbol = str[i] == '-' ? true : false; // 记录数字正负,如果第一个非空字符为负号,则为负数,否则为正数
if (!isdigit(str[i])) // 如果第一个非空字符不是数字,则下标i + 1指向下一个字符
i++;
long long ans = 0L;
while (i < len && isdigit(str[i]))
{
ans = ans * 10 + (str[i++] - '0');
if (!symbol && ans > INT_MAX) // 如果超过正数表示的最大范围,则返回INT_MAX
return INT_MAX;
if (symbol && ans > 1L + INT_MAX) // 如果超过负数表示的最大范围,则返回INT_MIN
return INT_MIN;
}
if (i != len) // 如果有非法字符,则返回0
return 0;
return !symbol ? ans : -ans;
}
};