問題
定義一個(gè)函數(shù)蕾盯,將字符串轉(zhuǎn)換為32位有符號整數(shù)
要求:
- 讀入字符串并丟棄無用的前導(dǎo)空格
- 檢查下一個(gè)字符(假設(shè)還未到字符末尾)為正還是負(fù)號幕屹,讀取該字符(如果有)。 確定最終結(jié)果是負(fù)數(shù)還是正數(shù)级遭。 如果兩者都不存在望拖,則假定結(jié)果為正。
- 讀入下一個(gè)字符挫鸽,直到到達(dá)下一個(gè)非數(shù)字字符或到達(dá)輸入的結(jié)尾说敏。字符串的其余部分將被忽略。
- 將前面步驟讀入的這些數(shù)字轉(zhuǎn)換為整數(shù)(即丢郊,"123" -> 123盔沫, "0032" -> 32)。如果沒有讀入數(shù)字枫匾,則整數(shù)為 0 架诞。必要時(shí)更改符號(從步驟 2 開始)。
- 如果整數(shù)數(shù)超過 32 位有符號整數(shù)范圍 [?231, 231 ? 1] 干茉,需要截?cái)噙@個(gè)整數(shù)谴忧,使其保持在這個(gè)范圍內(nèi)。具體來說,小于 ?231 的整數(shù)應(yīng)- 該被固定為 ?231 俏蛮,大于 231 ? 1 的整數(shù)應(yīng)該被固定為 231 ? 1 。
返回整數(shù)作為最終結(jié)果上遥。
思路
1)將字符串中所有的空格去除搏屑,并判斷去除后的字符串長度
2)定義變量包括:結(jié)果、符號位標(biāo)記粉楚、索引
3)判斷第一個(gè)字符為正還是負(fù)辣恋,如果條件滿足則記錄標(biāo)記位否則默認(rèn)為正
4)獲取每一個(gè)字符,判斷是否為數(shù)字模软,并做越界處理
越界處理思路:結(jié)果大于MAXVALUE前九位 || (結(jié)果等于MAXVALUE前九位&&當(dāng)前數(shù)字大于MAXVALUE最后一位)則中止循環(huán)
5)如果沒有越界伟骨,結(jié)果*10+當(dāng)前字符
總結(jié):
1)去除空格
2)判斷符號位
3)讀取判斷拼裝數(shù)字
實(shí)現(xiàn)
class Solution {
public int myAtoi(String s) {
//去除空格
s = s.trim();
if(s.length() == 0){
return 0;
}
//定義結(jié)果
int result = 0;
//定義符號位
int sign =1;
//字符串長度
int length = s.length();
//判斷符號
int index=0;
if(s.charAt(index)=='+' || s.charAt(index)=='-'){
sign =s.charAt(index++)=='+'?1:-1;
}
//判斷字符
for(;index<length;++index){
// -0是因?yàn)楫?dāng)前遍歷得到的字符有可能是字母,需要將值轉(zhuǎn)換為ASC碼
int temp = s.charAt(index)-'0';
//如果是非數(shù)組則終止循環(huán)
if(temp<0 || temp>9){
break;
}
//判斷越界
//判斷前九位 和 前九位相等比對最后一位
if(result > Integer.MAX_VALUE/10 || (result == Integer.MAX_VALUE/10 && temp>Integer.MAX_VALUE%10)){
return sign==1?Integer.MAX_VALUE:Integer.MIN_VALUE;
}else{
result = result*10+temp;
}
}
return sign*result;
}
}
image.png