題目描述:
寫一個函數 StrToInt,實現把字符串轉換成整數這個功能。不能使用 atoi 或者其他類似的庫函數。
說明:
假設我們的環境只能存儲 32 位大小的有符號整數,那麼其數值範圍爲 [−231, 231 − 1]。如果數值超過這個範圍,請返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
思路分析:
去掉字符串左邊的空格,然後從頭往後遍歷,如果第一位爲+或者-,往後遍歷,如果遇到非數字,結束循環,如果是數字,將數字記錄下來。
注意:本題難點在於如何處理溢出問題。
int範圍爲:-2^31 ~2^31-1,即 -2147483648 ~2147483647,如果用int類型的數字num判斷肯定會出錯,因爲超過int類型大小的數字由於溢出,溢出後的值肯定小於最大值,導致沒法判斷。這裏可以通過判斷數字num和Integer.MAX_VALUE / 10的值來確定是否溢出。
參考代碼:
public int strToInt(String str) {
if(str == null || str.length() == 0)return 0;
int i = 0;
while(i < str.length() && str.charAt(i) == ' ')i++;
if(i >= str.length())return 0;
int flag = 1;
if(str.charAt(i) == '-')flag = -1;
if(str.charAt(i) == '-' || str.charAt(i) == '+')i++;
int res = 0;
while(i < str.length()){
if(str.charAt(i) < '0' || str.charAt(i) > '9')break;
if(res > Integer.MAX_VALUE / 10 || res == Integer.MAX_VALUE / 10 && str.charAt(i) > '7')return flag == -1 ? Integer.MIN_VALUE : Integer.MAX_VALUE;
res = res * 10 + str.charAt(i) - '0';
i++;
}
return flag * res;
}