把字符串转换成整数(atoi)
描述
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
- 若干空格
- (可选)一个符号字符(‘+’ 或 ‘-’)
- 数字,字母,符号,空格组成的字符串表达式
- 若干空格
转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3 整数超过 32 位有符号整数范围 [−231, 2****31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被调整为 −2****31 ,大于 2****31 − 1 的整数应该被调整为 2****31 − 1
4.去掉无用的后导空格
数据范围:
- 0 <=字符串长度<= 100
- 字符串由英文字母(大写和小写)、数字(0-9)、’ ‘、’+‘、’-’ 和 ‘.’ 组成
实例1
输入:
"82"
返回值:
82
实例2
输入:
" -12 "
返回值:
-12
说明:
去掉前后的空格,为-12
实例3
输入:
"4396 clearlove"
返回值:
4396
说明:
6后面的字符不属于有效的整数部分,去除,但是返回前面提取的有效部分
实例4
输入:
"clearlove 4396"
返回值:
0
实例5
输入:
"-987654321111"
返回值:
-2147483648
思路/解法
根据不同情况下逐一判断即可。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int StrToInt(string s) {
int res = 0;
int isFu = 0;
bool flag = false;
for(int i = 0;i < s.length();i++)
{
//判断为正数还是负数
if((s[i] == '-' || s[i] == '+') && isFu != 0)
break;
else if(s[i] == '-' && !flag)//正负数之前不能有数字否则直接break
isFu = 1;
else if(s[i] == '+' && !flag)//正负数之前不能有数字否则直接break
isFu = 2;
//数据则累加
else if(s[i] >= 48 && s[i] <= 57)
{
//方式一
res = res*10 + (s[i] - 48);
//考虑int类型越界问题
if(res < 0)
{
res = INT_MAX;
if(isFu == 1)
return (res+1)*(-1);
return res;
}
flag = true;
//方式二
//int temp = isFu == 1?res*(-1):res;
//考虑int类型越界问题
//if (temp > INT_MAX / 10 || (temp == INT_MAX / 10 && s[i] - 48 > INT_MAX % 10)) return INT_MAX;
//if (temp < INT_MIN / 10 || (temp == INT_MIN / 10 && s[i] - 48 < INT_MIN % 10)) return INT_MIN;
//res = res * 10 + (s[i] - 48);
//flag = true;
}
else if(flag || s[i] != ' ')//除此之外,已经有数据累加至res且出现其他字符则直接break或者如“q12”这类情况则直接去除
break;
}
if(isFu == 1)
return (-1)*(res);
return res;
}
};