leetcode 8. 字符串转换整数 (atoi)
難度:中等
頻次:75
題目:
請你來實(shí)現(xiàn)一個 myAtoi(string s) 函數(shù),使其能將字符串轉(zhuǎn)換成一個 32 位有符號整數(shù)(類似 C/C++ 中的 atoi 函數(shù))。
函數(shù) myAtoi(string s) 的算法如下:
讀入字符串并丟棄無用的前導(dǎo)空格
檢查下一個字符(假設(shè)還未到字符末尾)為正還是負(fù)號,讀取該字符(如果有)。 確定最終結(jié)果是負(fù)數(shù)還是正數(shù)。 如果兩者都不存在,則假定結(jié)果為正。
讀入下一個字符,直到到達(dá)下一個非數(shù)字字符或到達(dá)輸入的結(jié)尾。字符串的其余部分將被忽略。
將前面步驟讀入的這些數(shù)字轉(zhuǎn)換為整數(shù)(即,“123” -> 123, “0032” -> 32)。如果沒有讀入數(shù)字,則整數(shù)為 0 。必要時更改符號(從步驟 2 開始)。
如果整數(shù)數(shù)超過 32 位有符號整數(shù)范圍 [?231, 231 ? 1] ,需要截斷這個整數(shù),使其保持在這個范圍內(nèi)。具體來說,小于 ?231 的整數(shù)應(yīng)該被固定為 ?231 ,大于 231 ? 1 的整數(shù)應(yīng)該被固定為 231 ? 1 。
返回整數(shù)作為最終結(jié)果。
注意:
本題中的空白字符只包括空格字符 ’ ’ 。
除前導(dǎo)空格或數(shù)字后的其余字符串外,請勿忽略 任何其他字符。
解題思路:按提示遍歷
- 首先丟棄無用前導(dǎo)空格 [題目的提示]
- 可能會有string都是空格的情況,需要排除
- 接著讀取符號位字符 [題目的提示]
- 有符號位的時候需要進(jìn)行的處理,標(biāo)志位+1 -1
- 沒有±號的時候不用處理,標(biāo)志位起始值就為1
- 讀取數(shù)字 [題目的提示]
- 用一個while判斷i和n的大小即可
- 如果不是數(shù)字,直接退出
- 那么剩下的情況就是數(shù)字
- 預(yù)判這輪加上后是是否大于Integer的取值,這一步不能簡單用res>Integer.MAX_VALUE,因為res如果超過最大值,就會變成復(fù)數(shù)了。這是這道題的精髓,不讓用double,不然就可以直接比較。
- 預(yù)判結(jié)果超出界限(拿最大值舉例子2147483647)只有兩種情況
- 1.當(dāng)之前的res>214748364,接下來的那一位無論是哪個數(shù)字,都會超出界限
- 2.當(dāng)之前的res==214748364,接下來的那以為必須要大于7時才會超出界限【這里負(fù)數(shù)不一樣,-2147483648,最后一位必須大于8】
- 預(yù)判結(jié)果超出界限(拿最大值舉例子2147483647)只有兩種情況
- 預(yù)判這輪加上后是是否大于Integer的取值,這一步不能簡單用res>Integer.MAX_VALUE,因為res如果超過最大值,就會變成復(fù)數(shù)了。這是這道題的精髓,不讓用double,不然就可以直接比較。
代碼
class Solution {public int myAtoi(String s) {//當(dāng)前下標(biāo)int i=0;int res=0;int n=s.length();char[] charArray=s.toCharArray();//1.丟棄無用的前導(dǎo)空格while(i<n && charArray[i]==' '){i++;}//======需要排除全部都是' '的情況//下標(biāo)=n說明char數(shù)組已經(jīng)遍歷完了,那就沒有了if(i==n) return 0;//2.檢查該字符是+號還是-號int sign=1;//==有效位數(shù)if(charArray[i]=='-'){sign=-1;i++;}else if(charArray[i]=='+'){i++;}//判斷是否跳出循環(huán)while(i<n){if(charArray[i]>'9'||charArray[i]<'0') break;int max=Integer.MAX_VALUE;int min=Integer.MIN_VALUE;//3.預(yù)判是否在范圍內(nèi)//因為在int的大小有限,Integer.MAX_VALUE+1就會變成Integer.MIN_VALUE//所以得預(yù)判,即超過max=2147483647的有兩種情況//第一種:之前的res比 214748364(max/10)要大,那無論一下位是什么都會超出界限//第二種:之前的res剛好跟214748364(max/10)相等,那下一位只有超過7才會超出界限if (res > max / 10 || (res == max / 10 && (charArray[i]-'0') > max % 10)) {return max;}if (res < min / 10 || (res == min / 10 && (charArray[i]- '0') > -(min % 10))) {return min;}//負(fù)號要每一次都×尾數(shù)res=10*res+sign*(charArray[i]-'0');i++;}return res;} }總結(jié)
以上是生活随笔為你收集整理的leetcode 8. 字符串转换整数 (atoi)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 110. 平衡二叉树
- 下一篇: leetcode 2. 两数相加