字符串转化为整数(模拟实现atui)
题目描述
给定一个字符串,该字符串表示一个整数,现在需要将该字符串转化为整数输出。其中字符串中可能含有空格,正负号以及数字。
要求:
1. 若字符串中存在无效字符,则返回0;
2. 若字符串中的整数超出了int类型的取值范围,则返回INT_MAX或INT_MIN。
解题思路
该题是一道较为基础的模拟题,需要考虑多种情况:
1. 字符串为空或长度为0,则直接返回0;
2. 若字符串中存在空格,则需要将空格去除,再进行转化;
3. 考虑正负号的情况,需要进行特殊处理;
4. 循环遍历字符串中的每一个字符,将其转化为数字,判断是否超出了int类型的取值范围。
5. 最后返回该整数的结果。
具体实现
代码如下:
#include <iostream>
#include <string>
#include <limits.h>
using namespace std;
class Solution {
public:
int myAtoi(string str) {
if(str.empty()) return 0; //字符串为空
int n=str.length(), i=0, sign=1;
long res=0;
while(i<n && str[i]==' ') i++; //去除空格
if(i<n && (str[i]=='+' || str[i]=='-')){ //处理正负号
sign=(str[i++]=='+')?1:-1; //i++表示取出正负号后的数字
}
while(i<n && isdigit(str[i])){ //转化数字
res=res*10+(str[i++]-'0');
if(res*sign > INT_MAX) return INT_MAX; //超出最大范围
if(res*sign < INT_MIN) return INT_MIN; //超出最小范围
}
return res*sign;
}
};
int main() {
string s = " -42";
Solution solution;
cout << solution.myAtoi(s) << endl;
return 0;
}
解释:
1. 初始化字符串长度n、指针i和符号sign(默认为正号),结果res为long类型,后面还需要进行处理。
2. while循环去除字符串中的空格。
3. if处理正负号,并将指针i移到数字的 位。
4. while循环将字符转化为数字,并进行判断是否超出了int类型的取值范围。
5. 最后返回结果的值。
增强版
接下来我们考虑增强版的题目:LeetCode-8,需要支持更多的情况转化为整数:
- 字符串前缀空格
- 字符串前缀 +/- 号
- 个非空字符不是数字
- 处理范围,转化后的整数若超出整型范围,返回其最大或最小值
这里几个注意事项:
- 字符串为空,返回0
- 若遇到无效字符,停止转化,返回目前的转化结果
- 去掉前缀空格之后,且 个非空字符不是数字,也返回0。
代码如下:
class Solution {
public:
int myAtoi(string s) {
int i=0,len=s.size(),ans=0,sign=1;
//处理字符串前缀空格
while(i<len && s[i]==' ') i++;
//字符串为空或空格,返回0
if(i==len) return 0;
//处理前缀符号
if(s[i]=='+' || s[i]=='-'){
if(s[i]=='-') sign=-1;
i++;
}
while(i<len){
// 个非空字符不是数字,结束转化,返回结果
if(!isdigit(s[i])) return sign*ans;
int tmp=s[i]-'0'; //将字符转化为数字
//判断是否超过整型最大值
if(sign==1 && ans>INT_MAX/10) return INT_MAX;
if(sign==1 && ans==INT_MAX/10 && tmp>7) return INT_MAX;
//判断是否超过整型最小值
if(sign==-1 && ans>INT_MAX/10) return INT_MIN;
if(sign==-1 && ans==INT_MAX/10 && tmp>8) return INT_MIN;
ans=ans*10+tmp;
i++;
}
return sign*ans;
}
};
总结:
该题是一道较为基础的模拟题,需要考虑多种情况:空格、正负号以及数字等。处理好每一个细节,就能够完成本题。另外增强版的LeetCode-8,需要更多的细节判断,但是针对这些细节的判断,只需要增加少量代码就可以实现。
