充分考虑输入字符串的特殊性:
1. 空字符串
2. 全非数字的字符串
3. 前半段数字后半段非数字字符串
4. 前半段非数字后半段数字
5. 合法数字
6. 前后有空格的合法数字
7. 越界的数字
int类型的界限[-2147483648,2147483647]
- 这是一个很重要的条件用于判断输入数字是否越界
处理步骤:
- 空字符串先处理
- 把头尾空格去掉
- 处理符号位
- 计算
- 判断越界
class Solution {
public:
int myAtoi(string str) {
//1.处理空字符串
if(str=="")
return 0;
//2.处理前后空格
str = trim(str);
//3.处理符号位
char *s = toCharArray(str);
int i=0;
int flag = 0; //判断是负数
if(s[0]=='+')i++;
if(s[0]=='-') {flag=1;i++;}
//4.计算
long long ans = 0;
long long MAX = 2147483647;
long long MIN = 2147483648;
for(;i<str.length();i++) {
if(!check(s[i])) {
break;
}else {
ans = ans*10+s[i]-'0';
//5.溢出在这里判断
if(flag==1){
if(ans>MIN) {
ans=MIN;
ans = -ans;
return (int)ans;
}
}else{
if(ans>MAX) {
ans=MAX;
return (int)ans;
}
}
}
}
//非溢出在这里处理
if(flag==1)
ans = -ans;
return (int)ans;
}
//判断字符为数字
int check(char c) {
if(c>='0'&&c<='9')
return 1;
return 0;
}
//去除头尾空格
string trim(string str){
int i=0;
while(i<str.length())
{
if(str[i]==' ') i++;
else break;
}
int j=str.length();
while(j>0)
{
if(str[j-1]==' ') j--;
else break;
}
if(i>=j)
return "";
else
{
char *newstr = new char[j-i+1];
int k=i;
int g=0;
while(k<j)
newstr[g++] = str[k++];
newstr[g]='\0';
string newstring(newstr);
return newstring;
}
}
//stringTochar
char* toCharArray(string str){
int length = str.length();
char* c_str = new char[length+1];
int i=0;
for(;i<length;i++)
c_str[i] = str[i];
c_str[i]='\0';
return c_str;
}
};
class Solution {
public int myAtoi(String str) {
//1.处理空字符串
if(str.equals(""))
return 0;
//2.处理前后空格
str = str.trim();
//处理符号位
char[] s = str.toCharArray();
int i=0;
boolean flag = false; //判断是负数
if(s[0]=='+')i++;
if(s[0]=='-') {flag=!flag;i++;}
//计算
long ans = 0;
long MAX = 2147483647;
long MIN = -2147483648;
for(;i<s.length;i++) {
if(!check(s[i])) {
break;
}else {
ans = ans*10+s[i]-'0';
//用整数记录溢出值
if(flag) {
if(-ans<MIN) {
ans=MIN;
return (int)-ans;
}
}else {
//判断溢出
if(ans>MAX) {
ans=MAX;
return (int)ans;
}
}
}
}
if(flag)
ans = -ans;
return (int)ans;
}
private boolean check(char c) {
if(c>='0'&&c<='9')
return true;
return false;
}
}