官解
刚开始理解错题目的意思了,越做到后面越乱,基本上把这道题的坑都踩了,还好人还在。
思路:
(1)先找到第一个合法的字符,ind注意初始化一定也要是-1,如果不是-1,当输入空字符串的时候会有问题.
(2)把连续的数字拼接成一个新的字符串
(3)计算这个字符串的值,注意不能先把值计算出来再去添加符号,那样在计算的时候可能就越界了。
#include<bits/stdc++.h>
using namespace std;
int myAtoi(string s) {
string s1 = "";
int ind = -1;
for(int i = 0; i < s.length(); i++){
if(s[i] == ' ') {
continue;
}
else if(s[i] == '+' || s[i] == '-'){
ind = i;
break;
}
else if(s[i] >= '0' && s[i] <= '9'){
ind = i;
break;
}
else {
ind = -1;
break;
}
}
if(ind == -1) return 0;
s1 += s[ind];
for(int i = ind + 1; i < s.length(); i++){
if(s[i] >= '0' && s[i] <= '9'){
s1 += s[i];
}else{
break;
}
}
long long num = 0;
int f = 0;
if(s1[0] == '-') f = -1;
else f = 1;
for(int i = 0; i < s1.length(); i++){
if(s1[i] == '-' || s1[i] == '+') continue;
num = num * 10 + s1[i] - '0';
if(f * num > INT_MAX) return INT_MAX;
if(f * num < INT_MIN) return INT_MIN;
}
return (int)num * f;
}
int main(){
string s;
while(getline(cin,s)){
cout << myAtoi(s) << endl;
}
return 0;
}
大佬的写法
class Solution {
public:
int myAtoi(string str) {
int state = 0;
long long s = 0;
int sign = 1;
for (int i = 0; i < str.length(); i++) {
char t = str[i];
if (state == 0 && t == ' ') {
state = 0;
} else if (state == 0 && (t == '-' || t == '+')) {
state = 1;
} else if ((state == 0 || state == 1 || state == 2) && (t >= '0' && t <= '9')) {
state = 2;
} else {
state = 3;
}
if (state == 1) sign = t == '-' ? -1 : 1;
if (state == 2) {
s = s * 10 + (int) (t - 48);
if (s * sign >= INT_MAX) return INT_MAX;
if (s * sign <= INT_MIN) return INT_MIN;
}
if (state == 3) break;
}
return (int) s != 0 ? (int) s * sign : 0;
}
};