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