通过率很低的一道easy题,题目难就难在要过滤各种不合理字符串输入(多个正负号、0的处理、义字符、符号插入等等),还要考虑越界问题。我费尽力气解决了输入问题后,屡次出现越界问题,于是怒看解答终于AC。。。
自己的版本老有个case(-2147483647)过不去,但在自己机器上是正确的,无奈。。。也贴上来作为轨迹:
long long tenPower(int power)
{
long long result = 1;
while (power > 0) {
result *= 10;
power--;
}
return result;
}
char *strFilter(char *s) // "0123" "-0132" "+0123" "01k23" "094-12" " - 0100 0 " " 3 345 "
{
char *result = NULL;
int sLength = (int)strlen(s);
int count = 0;
bool isSpace = true;
//重新构造一个过滤过的字符串返回
result = (char *)malloc(sLength * sizeof(char));
memset(result, 0, strlen(result));
int index = 0;
for (int i = 0; i < sLength; i++) {
if (s[i] == '+' | s[i] == '-') {
if (count < 1) {
count++;
isSpace = false;
result[index] = s[i];
index++;
continue;
}
else {
break;
}
}
else if (s[i] == ' ') {
if (isSpace) {
continue;
}
else {
break;
}
}
else if (s[i] >= '0' && s[i] <= '9') {
isSpace = false;
result[index] = s[i];
index++;
continue;
}
else {
break;
}
}
return result;
}
int myAtoi(char *s)
{
long long result = 0;
int power = 0;
bool isNagtive = false;
char *temps = strFilter(s);
if (temps)
;
else
return 0;
if (temps[0] == '-')
isNagtive = true;
int sLength = (int)strlen(temps);
for (int i = sLength - 1; i >= 0; i--) { // "0123" "-0132" "+0123" "01k23" "094-12" " 0100" " 345 "
if (temps[i] >= '0' && temps[i] <= '9') {
if (temps[i] == '0') {
power++;
}
else {
if (result < INT_MIN || result > INT_MAX) {
if (isNagtive)
result = -result;
if (result > INT_MAX) {
result = INT_MAX;
}
else if (result < INT_MIN) {
result = INT_MIN;
}
if (isNagtive)
result = -result;
break;
}
result = result + (temps[i] - '0') * tenPower(power);
power++;
}
}
}
if (isNagtive)
result = -result;
if (result > INT_MAX) {
result = INT_MAX;
}
else if (result < INT_MIN) {
result = INT_MIN;
}
free(temps);
return (int)result;
}
作为一道easy题,上面的代码明显超过长度,尤其是power和过滤函数,其实只要几句话就可以到达目的,只是当时自己的思维还是一个个来单独处理,没有连起来的思维,所以需要继续锻炼。
以下是借鉴的版本,power函数其实用反转integer的关键代码就行,过滤的自己考虑复杂了,其实规律很好找:
int myFixedAtoi(char *s)
{
int result = 0;
int i = 0;
int sign = 0;
int sLength = (int)strlen(s);
while (i < sLength && s[i] == ' ')
i++;
if (s[i] == '+')
i++;
else if (s[i] == '-') {
i++;
sign = 1;
}
for (; i < sLength; i++) {
if (s[i] < '0' || s[i] > '9')
break;
else if (result > INT32_MAX / 10 || (result == INT32_MAX / 10 && (s[i] - '0') > INT32_MAX % 10)) {
if (!sign)
return INT32_MAX;
else
return INT32_MIN;
}
result = result * 10 + (s[i] - '0');
}
if (sign)
result = -result;
return result;
}