實現 atoi:將字符串轉為 32 位有符號整數。
INT_MAX (2147483647) 或 INT_MIN (-2147483648)trim() 去除首尾空白toCharArray() 轉字符數組sum += (ch - '0') * 10^pos,用 long 防溢出class Solution {
public int myAtoi(String str) {
char[] arr = str.trim().toCharArray();
if (arr.length == 0) return 0;
int sign = 1;
long sum = 0;
// 處理符號位
if (arr[0] == '+' || arr[0] == '-' || (arr[0] >= '0' && arr[0] <= '9')) {
if (arr[0] == '+') { arr[0] = '0'; sign = 1; }
else if (arr[0] == '-') { arr[0] = '0'; sign = -1; }
// 確定最高位
int maxLevel = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= '0' && arr[i] <= '9') maxLevel++;
else break;
}
// 累加賦值
int copy = maxLevel;
for (int i = 0; i < maxLevel; i++) {
sum += (arr[i] - '0') * Math.pow(10, --copy);
}
long val = sum * sign;
if (val > Integer.MAX_VALUE) return Integer.MAX_VALUE;
if (val < Integer.MIN_VALUE) return Integer.MIN_VALUE;
return (int) val;
}
return 0;
}
}
| 陷阱 | 說明 |
|---|---|
| 字符比較 | 必須用單引號 '0' '9' '+' '-' |
| 字符轉數字 | ch - '0' 而非 Integer.parseInt |
| INT_MIN 非對稱 | Integer.MIN_VALUE = -2147483648,MAX_VALUE = 2147483647,絕對值不同 |
| 空字符串 | trim() 後可能為空,需檢查 length == 0 |
| 溢出檢查 | 累加用 long,最終轉 int 前截斷 |
"42" → 42 " -42" → -42 "4193 with words" → 4193 "words and 987" → 0 "-91283472332" → -2147483648 (INT_MIN) "3.14159" → 3 "" → 0 " " → 0
Math.pow 浮點運算,改用整數乘法累加:sum = sum * 10 + (ch - '0')Character.isDigit(ch) 替代範圍判斷