將字符串轉化爲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/