題目描述:
將一個字符串轉換成一個整數(實現Integer.valueOf(string)的功能,但是string不符合數字要求時返回0),要求不能使用字符串轉換整數的庫函數。 數值為0或者字符串不是一個合法的數值則返回0。
輸入輸出描述:
輸入一個字符串,包括字母、數字、符號,可以為空。如果是合法的數值表達則返回該數字,否則返回0。
解題思路:
本題解決起來並不困難,功能實現簡單,但是主要的問題是能否把各種不同的特殊情況都考慮進去,也就是代碼的魯棒性和思考的全面,比如空指針、空字符串、正負號、溢出等等問題。
主要需要注意的點有以下幾個:
- 字符串是否為null或者字符串是否為空字符串。
- 字符串對於正負號的處理,特別是正號,可能有也可能沒有,但都代表正數
- 輸入值是否合法,判斷除首位可能為正負號外,其他位是否都是數字
- int為32位,最大的整數是剛剛超過21億,也就是10位十進制數
- 使用錯誤標志,區分合法值0和非法值0
以下直接給出相應的代碼實現。
編程實現(Java):
public class Solution {
public int StrToInt(String str) {
if(str==null || str.length()<1)
return 0;
boolean isVaild=false; //用來標記是否合法
char c = str.charAt(0);
int flag=0;
//通過首位進行判斷,並標記
if(c=='+') //為正數
flag=1;
else if(c=='-') //為負數
flag=-1;
else if(c>='0'&&c<='9') { //正數
flag=1;
str="+"+str; //便於統一處理
}else { //不是數
isVaild=true;
return 0;
}
int len= str.length();
//計算后續數字
if(len>11) //最大整數是10位
return 0;
long res=0;
for(int i=1;i<len;i++){
c=str.charAt(i);
if(c<'0'||c>'9'){
isVaild=true;
return 0;
}
res=res*10+(c-48); //計算數值大小
}
if(flag==1 && res<=Integer.MAX_VALUE)
return (int)res;
if(flag==-1 && (-1*res)>=Integer.MIN_VALUE)
return (int)(-1*res);
isVaild=true;
return 0;
}
}