8. String to Integer (atoi)
Difficulty: Easy
实现atoi函数的功能,将字符串转换成整数。要考虑到所有可能的输出情况,细节很多。
Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
步骤:
1.去掉多余的空格字符
2.读+、-符号(正数可能没有符号)
3.结束条件:异常字符出现(将异常字符起的后面截去,保留前面的部分);数字越界(返回最接近的整数);字符串结束
注意:
1.int型范围:-2147483648~-2147483647
2.ASCII码:
‘0’~’9’ 48~57
’ ’ 0
‘+’ 43
‘-’ 45
细节分析:
例如:
“+10” 10
” 010” 10
” -0012a42” -12
“a1” 0
“-12+10” -12
“0+10” 0
“+ 13” 0
“1 5” 1
“2147483648” “2147483647”
“-2147483649” “-2147483648”
1.数字前面有空格 如s=“ 123456”
2.数字前出现了不必要或多于的字符导致数字认证错误,输出0 如s=“ b1234” ,s=“ ++1233” , s=“ +-1121”
3.数字中出现了不必要的字符,返回字符前的数字 如s=“ 12a12” , s=“ 123 123”
4.数字越界 超过了范围(-2147483648–2147483647) 若超过了负数的 输出-2147483648 超过了正数的输出2147483647
在科普一个知识点,倘若某个数超过了2147483647则会变为负数,反过来一样
这道题主要考察整数处理,注意点上面已经提到过,因为这个问题是C语言的一个基本问题,面试中还是有可能出现,相对比较底层,边缘情况的处理是关键,可能面试tester的职位会更常见一些。
int myAtoi(char* str) {
int i,k,m;
int len=strlen(str);
int retint;
int sign=-1;
int* arrayInt=(int*)malloc(len*sizeof(int));
//sign=0,出现数字;sign=1,出现正号;sign=2,出现负号
m=0;
for(i=0;i<len;i++)
{
if(str[i]<48 || str[i]>57) //不是数字
{
if(sign==-1)
{
if(str[i]==' ')
continue;
else if(str[i]=='+')
sign=1;
else if(str[i]=='-')
sign=2;
else //若首先出现其它符号,返回0
{
free(arrayInt);
return 0;
}
}
else //sign!=-1,已经出现过数字或正负号,再出现数字外的符号(包括空格),截止
{
break;
}
}
else //是数字
{
if(sign==-1)
sign=0;
arrayInt[m]=str[i]-'0';
m++; //m记录数的位数
}
}
retint=0;
k=m-1;
for(i=0;i<m;i++)
{
retint+=arrayInt[i]*pow((float)10,k);
k--;
if(retint<0) //溢出
break;
}
free(arrayInt);
if(sign==2 && retint<0) //负数溢出,返回-2147483648
return 2147483647+1;
else if(retint<0) //正数溢出,返回2147483647
return 2147483647;
else if(sign==2) //负数
return -retint;
return retint;
}