題目描述:
請你來實現一個 atoi 函數,使其能將字符串轉換成整數。
- 首先,該函數會根據需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符爲止。
- 當我們尋找到的第一個非空字符爲正或者負號時,則將該符號與之後面儘可能多的連續數字組合起來,作爲該整數的正負號;假如第一個非空字符是數字,則直接將其與之後連續的數字字符組合起來,形成整數。
- 該字符串除了有效的整數部分之後也可能會存在多餘的字符,這些字符可以被忽略,它們對於函數不應該造成影響。
- 注意:假如該字符串中的第一個非空格字符不是一個有效整數字符、字符串爲空或字符串僅包含空白字符時,則你的函數不需要進行轉換。
- 在任何情況下,若函數不能進行有效的轉換時,請返回 0。
樣例:
輸入: “words and 987”
輸出: 0
解釋: 第一個非空字符是 ‘w’, 但它不是數字或正、負號。因此無法執行有效的轉換。
輸入: “4193 with words”
輸出: 4193
解釋: 轉換截止於數字 ‘3’ ,因爲它的下一個字符不爲數字。
輸入:-000020-300000
輸出: -20
分析:
- 去除字符串首尾的空格字符,第一個字符只能是正負號或者數字;
- 出現有效數字後之後出現非數字字符都忽略,直接return非數字字符之前形成的有效數字
- 注意超出int範圍內的數字要用最大值或者最小值代替
public int myAtoi2(String str) {
if(str==null||str.length()==0)
return 0;
str=str.trim();//去除首尾空格
StringBuilder sb=new StringBuilder();
boolean isNeg=false;
for(char c:str.toCharArray()) {
if(sb.length()==0&&(c=='+'||c=='-')) {
if(c=='-')
isNeg=true;
sb.append(c);
}else if(c>='0'&&c<='9') {
sb.append(c);
}else {
break;
}
}
if(sb.length()==0||(sb.length()==1&&(sb.charAt(0)=='+'||sb.charAt(0)=='-')))
return 0;
try {
return Integer.parseInt(sb.toString());
} catch (NumberFormatException e) {
if (isNeg) {
return Integer.MIN_VALUE;
} else {
return Integer.MAX_VALUE;
}
}
}