面试题中经常出现的题目,将一个数字的字符串转换成整数。
需要注意的几个问题:
1,开头是:“+”,或者“-”。
2,进制的考虑,以“0x”开头的是16进制,以“0”开头的是8进制。计算方法: number = number*radix + ret;
3,溢出的考虑,最大正整数: 0x7FFFFFFF,最大负整数:0X8000000。溢出的判断, if(ret<MAX_INT/radix || ret==MAX_INT&&ret<=MAX_INT%radix)
补充一些关于整数溢出的问题,当对最大的正整数+1时,其将变为最大的负整数。之后继续执行++操作时,负整数将不断地变大,再变回为最大的正整数。如此循环。
利用这个原理可以应付如下面试题,不使用任何减法操作,实现如下函数:f(x),返回值是:x-1。
方法就是,引入辅助变量i=1,之后不断地对i和x执行++操作,知道i变为0。
代码如下:
int f(int x)
{
int i = 1,j = x;
for (;i;++i,++j);
return j;
}
atoi的代码如下:
int myAtoI(char* str)
{
int radix = 10;
char *ptr = str;
bool flag = false;
int number = 0;
int digival = 0;
int maxval = 0;
while(isspace(*ptr))
ptr++;
if(*ptr=='+') ptr++;
if(*ptr=='-')
{
flag = true;
ptr++;
}
if(*ptr=='0')
{
radix = 8;
if((*(ptr+1)=='x'||*(ptr+1)=='X'))
{
radix = 16;
ptr++;
}
ptr++;
}
maxval = INT_MAX/radix;
while(*ptr)
{
if(isdigit(*ptr))
digival = *ptr - '0';
else
if(isalpha(*ptr))
digival = toupper(*ptr) - 'A' + 10;
else
break;
if(number<maxval||number==maxval&&digival<=INT_MAX%radix)
number = radix*number + digival;
else
{
//overflow
if(flag)
return (-INT_MIN);
else
return INT_MAX;
}
ptr++;
}
if(flag)
return (-number);
else
return number;
}