Leetcode-8: String to Integer
9010 ワード
この問題の問題はあいまいで、テスト例の中の状況には特に注意しなければならない.私のコードは冗長すぎて、注釈したコードはLeetcodeの中のもので、書いたほうがいいです.
#include
#include
#include
using namespace std;
int myAtoi(string str) {
if (str.size()==0) return 0; //empty string returns 0
size_t flagPos=str.size();
size_t startPos=str.size();
for (auto i=0; iif ((str.at(i)=='+' || str.at(i)=='-') && flagPos==str.size() )flagPos=i;
if (isdigit(str.at(i))) {
startPos=i;
break;
}
}
if (flagPos!=str.size() && (startPos-flagPos>1)) return 0;
if (startPos==str.size()) return 0; //invalid string returns 0
else if (startPos>=1 && str.at(startPos-1)!='+' && str.at(startPos-1)!='-' && str.at(startPos-1)!=' ') return 0;
bool positive=true;
if ((startPos>0) && (str.at(startPos-1)=='-')) positive=false;
if (positive && startPos>=2 && str.at(startPos-2)=='-') return 0;
if (!positive && startPos>=2 && str.at(startPos-2)=='+') return 0;
int result=positive? str.at(startPos)-'0' : '0' - str.at(startPos);
for (auto i=startPos+1; iif (isdigit(str.at(i))) {
if (!positive) {
if (result < INT_MIN / 10 || (result == INT_MIN / 10 && str.at(i) - '0' > 7))
return INT_MIN;
else
result=result*10+'0'-str.at(i);
}
else {
if (result > INT_MAX / 10 || (result == INT_MAX / 10 && str.at(i) - '0' > 7))
return INT_MAX;
else
result=result*10+str.at(i)-'0';
}
}
else
break;
}
return result;
}
#if 0
int myAtoi(string str) {
int sign = 1, base = 0, i = 0;
while (str[i] == ' ') { i++; }
if (str[i] == '-' || str[i] == '+') {
sign = 1 - 2 * (str[i++] == '-');
}
while (str[i] >= '0' && str[i] <= '9') {
if (base > INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
if (sign == 1) return INT_MAX;
else return INT_MIN;
}
base = 10 * base + (str[i++] - '0');
}
return base * sign;
}
#endif // 0
int main()
{
string s="123";
cout<string s1="-23211";
cout<string s2="2147483647";
cout<string s3="-2147483648";
cout<string s4="000";
cout<string s5="+-2";
cout<string s6=" ++1"" -0012a42";
cout<string s7="2147483648";
cout<string s8="-2147483649";
cout<string s9=" + 413";
cout<string s10=" ++1";
cout<string s11=" b11228552307";
cout<string s12=" 010";
cout<string s13="w10734368512";
cout<return 0;
}