LeetCode--[字串]8. 字串轉整數 (atoi)
實現 atoi,將字串轉為整數。
在找到第一個非空字元之前,需要移除掉字串中的空格字元。如果第一個非空字元是正號或負號,選取該符號,並將其與後面儘可能多的連續的數字組合起來,這部分字元即為整數的值。如果第一個非空字元是數字,則直接將其與之後連續的數字字元組合起來,形成整數。
字串可以在形成整數的字元後面包括多餘的字元,這些字元可以被忽略,它們對於函式沒有影響。
當字串中的第一個非空字元序列不是個有效的整數;或字串為空;或字串僅包含空白字元時,則不進行轉換。
若函式不能執行有效的轉換,返回 0。
說明:
假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231, 231 − 1]。如果數值超過可表示的範圍,則返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
輸入: “42”
輸出: 42
示例 2:
輸入: ” -42”
輸出: -42
解釋: 第一個非空白字元為 ‘-‘, 它是一個負號。
我們儘可能將負號與後面所有連續出現的數字組合起來,最後得到 -42 。
示例 3:
輸入: “4193 with words”
輸出: 4193
解釋: 轉換截止於數字 ‘3’ ,因為它的下一個字元不為數字。
示例 4:
輸入: “words and 987”
輸出: 0
解釋: 第一個非空字元是 ‘w’, 但它不是數字或正、負號。
因此無法執行有效的轉換。
示例 5:
輸入: “-91283472332”
輸出: -2147483648
解釋: 數字 “-91283472332” 超過 32 位有符號整數範圍。
因此返回 INT_MIN (−231) 。
解答
注意一些特殊的輸入:
1.比如前面都是零,000000020,超出範圍的數,非法輸入等。
2.注意超出位數。通過位數來判斷當前是否超出int範圍。有三種情況:
* 前9位太大,有第10位;
* 前9位相等但是第10位太大(正負數分別考慮);
* 前10位較小,但是有第11位
int caldigit(int result) {
int num = 1;
while (result/10!=0) {
result = result / 10;
num++;
}
return num;
}
int myAtoi(char* str) {
char val = str[0 ];
// 查詢第一個非空字元的位置
int idx = 0;
while (val != '\0') {
//過濾空格
if (val != ' ') {
break;
}
idx++;
val = str[idx];
}
// 偏移
str = str + idx;
// 判斷第一個字元是什麼
val = str[0];
int is_positive = 1;
int result = 0; // 儲存轉化結果
int num = 0; // 儲存當前位數
int ch_idx = 0; // 字元下標
while (val != '\0') {
if (val == '+' && ch_idx == 0) {
is_positive = 1;
}
else if (val == '-' && ch_idx == 0) {
is_positive = 0;
}
// 其他字元,返回0
else if ((val<48 || val>57) && (ch_idx == 0)) {
printf("其他字元返回0, %c", val);
return 0;
}
// 不是第一個字元的情況,並且字元不是數字則退出。
else if (val<48 || val>57 && ch_idx != 0) {
printf("字元不是數字退出");
break;
}
// 判斷是否是數字
else if ((val >= 48) && (val <= 57)) {
int x = val - '0';
// 計算當前的數字的位數
num = caldigit(result);
// 判斷當前的數字是否越界
// [-2147483648,+2147483647]
if (num == 9) {
// 越界:前9位太大;前9位相等但是第10位太大;
if (abs(result) > 214748364 ||
(abs(result) == 214748364 && x > 7 && is_positive) ||
(abs(result) == 214748364 && x > 8 && !is_positive) ) {
return is_positive ? 2147483648 -1 : -2147483648;
}
}
//前10位沒有超過,但是有第11位
if (num == 10) {
return is_positive ? 2147483648 - 1 : -2147483648;
}
result = result * 10 + x;
}
ch_idx++;
val = str[ch_idx];
}
return is_positive ? result : -result;
}