题意:编写一个函数将字符串中的数字转换成数字。
要求:
能提取出数字的情况:
1.“ 32345”前面有空格
2.“ -39405”前面有正负号
3.“ 382ab4”数字后面出现有其他字符的,则只提取之前的数字
4. 提取的数字超出整型数的表示范围,则输出INT_MAX或者INT_MIN
不能提取出数字的情况:
1.字符串中只有空格或者字符串为空,返回0;
2.数字前面出现两个以上的正负号或者数字前面出现其他字符,返回0
本题难易程度为easy,主要是要考虑到说有可能出现的情况。
int myAtoi(string str) {
int num[1000];
for (int k = 0; k < 1000; k++)
num[k] = 0;
int flag1=1,flag2=0;//记录'+'和'-'接连出现的次数
string::iterator it = str.begin();
//舍弃掉字符串前面的空格
while (it < str.end())
{
if (*it != ' ') break;
it++;
}
if (it == str.end() || str.size() == 0) return 0; //全是空格或者字符串为空,返回0
int i = 0, n = 0;
while (it != str.end())
{
n = *it++;
if (n == 43) flag1++;
else if (n == 45) flag2++;
else if (n >= 48 && n <= 57) break;
else return 0;//遇到数字之前只要遇到不该出现的字符,就返回0
}
//由于跳出循环有两种情况。一种是遇到数字字符break了,另一种是直到字符串遍历结束只有正负符号。
if (flag1 > 2 || flag2 > 1 || (flag1 == 2 && flag2 == 1)) return 0;//数字前面有多个符号
if (it == str.end() &&(n < 48 || n>57)) return 0;//字符串中只有符号并没有数字
num[i++] = n - 48;
while (it != str.end())
{
n = *it++;
//在数字后面出现其他字符,就跳出循环,最后所得数字就是此前提取的数字
if (n < 48 || n>57) break;
num[i++] = n - 48;
}
long long number = 0;
int j = 0;
while (j<i)
{
number = number * 10 + num[j++];
//每添加一位数字则判断number有没有越界。
//如果等到存完数据再判断是否越界,因为尽管number是long long型的,
//但是存入的数字也有越界的可能,越界后符号会改变值也变了,就无法判断了。
if (flag2 == 0 && number>2147483647) return 2147483647;
else if(flag2==1 && number>2147483648) return -2147483648;
}
return flag2 ? -number : number;
}