8. String to Integer (atoi)
題目
將字符串轉換爲整數。
1.首先將遇到的空格捨棄,直到遇到首個非空字符。
2.然後,選擇正負號,將字符串翻譯成數值。
字符串可以包含構成整數的字符之後的其他字符,這些字符被忽略,對函數沒有影響。
Input: “4193 with words”
Output: 4193
3.如果str中的非空字符的第一個序列不是一個有效的整數,或者如果沒有這樣的序列存在,當str是空的,或者它只包含空白字符,那麼就不會執行轉換。
如果沒有有效的轉換,就返回零。
Input: “words and 987”
Output: 0
4.如果越界,返回邊界值(2147483647或-2147483648)
int是32bit,範圍 [−231, 231− 1]
INT_MAX (231− 1) or INT_MIN (−231) is returned.
Input: “-91283472332”
Output: -2147483648
代碼塊
class Solution {
public int myAtoi(String str) {
if(str.length() == 0|| str == null)
return 0;
int sign = 1;
int index = 0;
long result = 0;
while(index < str.length() && str.charAt(index) == ' '){//當全爲空的時候,index=str.length(),下面的if和for就都不會執行了.
index ++;
}
if(index < str.length()){//加一個大條件
if(str.charAt(index) == '-'){
sign = -1;
index ++;
}else if(str.charAt(index) == '+'){
index ++;
}
}
for(int j = index; j < str.length(); j++){
if(str.charAt(j) >= '0' && str.charAt(j) <= '9'){
result = result *10 + str.charAt(j) - '0';
if(result > java.lang.Integer.MAX_VALUE){
return sign <0 ?(java.lang.Integer.MIN_VALUE):(java.lang.Integer.MAX_VALUE);
// if(result > java.lang.Long.MAX_VALUE){
// return (int)( ***sign<'0'***?(java.lang.Long.MIN_VALUE):(java.lang.Long.MAX_VALUE)); sign是int型,不加引號。
}
}else{
break;
}
}
result *= sign;
return (int)result;
}
public static void main(String[] args) {
//String str = "2147483648";
String str = " 1";
System.out.println(myAtoi(str));
}
}
代碼分析
本題需要考慮幾種情況:
1. 如果爲空或者長度爲零時,返回0;
str=null 說明str沒有指向任何對象 ;而str長度爲零時str肯定不爲null的,此時str指向一個長度爲零的字符串。
2. 如果遇到空格就將索引往後移;(while)
3. 判斷符號;(是正是負)
4. 判斷數字是否在0-9;再判斷數值是否越界
5. 將數值乘字符表示出來。
本題的條件二(while)控制了str全爲空的情況,當全爲空的時候,index=str.length(),下面的if和for就都不會執行了。
java.lang.Integer.MAX_VALUE 表示Java中int型最大值。
空格的ASCII爲32;’0’的ASCII碼爲48。
Figure 1. ASCII