java中字符串轉(zhuǎn)整數(shù)及MyAtoi方法的實(shí)現(xiàn)
java中字符串轉(zhuǎn)整數(shù)及MyAtoi方法的實(shí)現(xiàn)
該題雖然和我們正常使用的字符串轉(zhuǎn)整數(shù)的API中函數(shù)不一致,但是通過(guò)增加了很多額外的邊界或者異常處理,可以鍛煉算法思維的敏銳性和處理邊界異常等問(wèn)題的能力。
思路:字符串題一般考查的都是邊界條件、特殊情況的處理。所以遇到此題一定要問(wèn)清楚各種條件下的輸入輸出應(yīng)該是什么樣的。
這里已知的特殊情況有:
- 能夠排除首部的空格,從第一個(gè)非空字符開始計(jì)算
- 允許數(shù)字以正負(fù)號(hào)(+-)開頭
- 遇到非法字符便停止轉(zhuǎn)換,返回當(dāng)前已經(jīng)轉(zhuǎn)換的值,如果開頭就是非法字符則返回0
- 在轉(zhuǎn)換結(jié)果溢出時(shí)返回特定值,這里是最大/最小整數(shù)
先來(lái)幾組測(cè)試用例:
" 010" " +004500" " -001+2a42" " +0 123" "-2147483648" "2147483648" " - 321" " -11919730356x" "9223372036854775809"
以上的測(cè)試用例對(duì)應(yīng)的正確輸出如下:
10 4500 -1 0 -2147483648 2147483647 0 -2147483648 2147483647
Java實(shí)現(xiàn)代碼如下:
public static int myAtoi(String str) { if(str==null||str.length()==0) return 0; char[] array = str.toCharArray(); long result = 0; // 要返回的結(jié)果result int count = 0; // 記錄‘+'或者‘-'出現(xiàn)的次數(shù) int num = 0; // 判斷空格出現(xiàn)的位置 int flag = 1; // 正數(shù)還是負(fù)數(shù) for (int i = 0; i < array.length; i++) { Character c = array[i]; if(c>='0'&&c<='9'){ result = result*10+c-'0'; // 判斷是否溢出 if(flag==1&&result>Integer.MAX_VALUE){ return Integer.MAX_VALUE; }else if(flag==-1&&-result<Integer.MIN_VALUE) return Integer.MIN_VALUE; num++; }else if(c==' '&&num==0&&count==0) continue; else if(c=='+'&&count==0){ count = 1; } else if(c=='-'&&count==0){ flag = -1; count = 1; } else{ return (int) (flag*result); } } return (int) (flag*result); }
在上邊的代碼中,for循環(huán)遍歷數(shù)組中,判斷某個(gè)char是否是數(shù)字,可以使用Character.isDigit(c)方法,計(jì)算result時(shí),可以使用Character.getNumericValue(c)方法來(lái)得到某個(gè)char類型的數(shù)值,總之就是可以很方便的使用Character里邊的靜態(tài)方法。
重寫的for循環(huán)如下:
for (int i = 0; i < array.length; i++) { Character c = array[i]; if(Character.isDigit(c)){ result = result*10+Character.getNumericValue(c); if(flag==1&&result>Integer.MAX_VALUE){ return Integer.MAX_VALUE; }else if(flag==-1&&-result<Integer.MIN_VALUE) return Integer.MIN_VALUE; num++; }else if(Character.isSpaceChar(c)&&num==0&&count==0) continue; else if(c=='+'&&count==0){ count = 1; } else if(c=='-'&&count==0){ flag = -1; count = 1; } else{ return (int) (flag*result); } }
當(dāng)面試時(shí)被問(wèn)到這個(gè)題,我們可以不慌不亂的和面試官親切交談,制定該函數(shù)的一些規(guī)則,即如何處理異常輸入等,之后,再遍歷數(shù)組,根據(jù)需求進(jìn)行相應(yīng)的異常處理哦~
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java中LinkedList和ArrayList的效率分析
本文主要介紹了Java中LinkedList和ArrayList的效率分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02java后臺(tái)實(shí)現(xiàn)支付寶對(duì)賬功能的示例代碼
這篇文章主要介紹了java后臺(tái)實(shí)現(xiàn)支付寶對(duì)賬功能的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08MyBatis-Plus解決邏輯刪除與唯一索引的問(wèn)題
本文主要介紹了MyBatis-Plus解決邏輯刪除與唯一索引的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08SpringBoot?+?Redis如何解決重復(fù)提交問(wèn)題(冪等)
在開發(fā)中,一個(gè)對(duì)外暴露的接口可能會(huì)面臨瞬間的大量重復(fù)請(qǐng)求,本文就介紹了SpringBoot + Redis如何解決重復(fù)提交問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法(二)
這篇文章主要介紹了SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法(二),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10java中實(shí)體類實(shí)現(xiàn)時(shí)間日期自動(dòng)轉(zhuǎn)換方式
這篇文章主要介紹了java中實(shí)體類實(shí)現(xiàn)時(shí)間日期自動(dòng)轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06親身體驗(yàn)Intellij?Idea從卡頓到順暢全過(guò)程
這篇文章主要介紹了親身體驗(yàn)Intellij?Idea從卡頓到順暢全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09