将字符串转化为int型整数:
1.当字符串中第一个数字之前既不是正负号也不是空格时,直接返回0。如“dakks 34”
2.当字符串中数据的大小超过整数的范围时,返回int能表示的最大值或最小值。
3.当遇到“+-333”时返回0。
先上自己的代码:
#define INT_MAX (2147483647)
#define INT_MIN (-2147483648)
int myAtoi(char* str) {
int len = strlen(str); // 传进来的字串长度
int i = 0; // 轮询字符串总长度
int found = 0; // 用来表示是否找到第一个数字或符号
long num = 0;
int plus_minus = 0; // 用来表示找到的数字的正负号
//printf("len = %d\r\n",len);
while(i < len)
{
if((found == 0)&&(str[i] == ' '))
{
// 未找到数字之前,空格直接跳过
i++;
//printf("space\r\n");
continue;
}
if((str[i] >= '0')&&(str[i] <= '9'))
{
found = 1;
// 判断是否超过正数的最大值
if((plus_minus == 0)&&((num * 10+(str[i]-'0')) > INT_MAX))
{
//printf("return int max\r\n");
return INT_MAX;
}
// 判断是否超过负数的最小值
else if((plus_minus == 1)&&((num * 10 - (str[i]-'0')) < INT_MIN))
{
//printf("return int min\r\n");
return INT_MIN;
}
if(plus_minus == 0)
{
num = num * 10 + (str[i]-'0');
}
else
{
num = num * 10 - (str[i]-'0');
}
//printf("num = %d,n = %d,plus_minus = %d,MAX = %d,MIN = %d\r\n",num,(str[i]-'0'),plus_minus,INT_MAX,INT_MIN);
}
else if(found == 1)
{
//printf("unuse char ,%c\r\n",str[i]);
return (int)num;
}
else if((found == 0)&&(str[i] != '-')&&(str[i] != '+'))
{
//printf("unuse char ,%c\r\n",str[i]);
return (int)num;
}
if((found == 0)&&(str[i] == '+'))
{
found = 1;
}
if((found == 0)&&(str[i] == '-'))
{
plus_minus = 1;
found = 1;
}
i++;
}
return (int)num;
}
leetcode给出的参考代码(至少代码的简洁程度上要比我自己的好很多,虽然执行的时间一样(可能是因为功能比较简单吧)):
bool isSign(char c)
{
return (c=='+' || c=='-');
}
bool isDigit(char c)
{
return (c>='0' && c<='9');
}
int myAtoi(char* str) {
int idx=0, rst=0;
long sign=0, num=0;
if(NULL != str)
{
while(str[idx])
{
if((num*sign) >= INT_MAX || (num*sign) <= INT_MIN)
{
break;
}
if(isDigit(str[idx]))
{
num = num*10 + str[idx] - '0';
sign = sign==0 ? 1 : sign;
}
else
{
if(num==0 && sign==0)
{
switch(str[idx])
{
case '+': sign=1; break;
case '-': sign=-1; break;
case ' ': break; //skip space
default: idx = strlen(str)-1; break; //stop and return 0
}
}
else
break;
}
idx++;
}
}
rst = (num*sign >= INT_MAX) ? INT_MAX : (num*sign <= INT_MIN ? INT_MIN : (int)(num & 0x000000007FFFFFFF)*sign);
return rst;
}
题目和参考代码来自:https://leetcode.com/