題目描述
實現 atoi,將字符串轉爲整數。
在找到第一個非空字符之前,需要移除掉字符串中的空格字符。如果第一個非空字符是正號或負號,選取該符號,並將其與後面儘可能多的連續的數字組合起來,這部分字符即爲整數的值。如果第一個非空字符是數字,則直接將其與之後連續的數字字符組合起來,形成整數。
字符串可以在形成整數的字符後面包括多餘的字符,這些字符可以被忽略,它們對於函數沒有影響。
當字符串中的第一個非空字符序列不是個有效的整數;或字符串爲空;或字符串僅包含空白字符時,則不進行轉換。
若函數不能執行有效的轉換,返回 0。
說明:
假設我們的環境只能存儲 32 位有符號整數,其數值範圍是 [−231, 231 − 1]。如果數值超過可表示的範圍,則返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。
示例 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 (−2^31) 。
思路
首先看完題想到的是需要把得到字符串的字符一個個進行轉換,不是數字的不能轉換,所以我想到了吧字符串轉化成字符數組,然後進行判斷。分爲以下幾個步驟
1. 首先是空格,這個特別容易被忽視,因爲輸入的字符串可能是這樣的形式(” +1234”),這就需要把字符串中前面的空格去掉。
2. 然後是正負號的判斷,正負號不能單單隻判斷第一個字母,小心是這種形式的字符串(” +-23 sss”)。
3. 再然後是溢出的判斷,這兒就需要在計算的過程中就進行判斷了,如果在計算的過程中就溢出了就可以不再進行下面的計算,我就是在算完以後再進行判斷,結果導致我long類型也溢出了。哈哈,因爲字符串的數字可能超過long的類型。
4. 最後需要判斷輸入的字符串是否爲空和”“這種形式。
代碼
class Solution {
public int myAtoi(String str) {
long ret = 0;
boolean isNagtive = false;
boolean isSpace = false;
if(str == null || str == "") return (int)ret;
char[] str2char = str.toCharArray();
int start = 0;
for(int i = 0; i < str2char.length; ++ i){
if(str2char[i] == ' ')
start += 1;
else
break;
}
for(int i = start; i < str2char.length;++ i){
if(i == start && str2char[i] < '0' && str2char[i] > '9' && str2char[i] != '-'){
if(str2char[i] == ' ') continue;
return (int) ret;
}
if(i == start && (str2char[i] == '-' || str2char[i] == '+')){
if(str2char[i] == '-')
isNagtive = true;
continue;
}
if(str2char[i] < '0' || str2char[i] > '9'){
break;
}
int tmp = str2char[i] - 48;
ret *= 10;
ret += tmp;
if(!isNagtive && ret > Integer.MAX_VALUE){
ret = Integer.MAX_VALUE;
break;
}
if(isNagtive && -ret < Integer.MIN_VALUE){
ret = Integer.MIN_VALUE;
break;
}
}
if(isNagtive){
ret = -ret;
}
// if(ret > Integer.MAX_VALUE) ret = Integer.MAX_VALUE;
// if(ret < Integer.MIN_VALUE) ret = Integer.MIN_VALUE;
return (int)ret;
}
}