劍指offer第二版-67.把字符串轉(zhuǎn)換成整數(shù)

本系列導(dǎo)航:劍指offer(第二版)java實(shí)現(xiàn)導(dǎo)航帖

面試題67:把字符串轉(zhuǎn)換成整數(shù)

題目要求:
如題。

解題思路:
此題比較麻煩的點(diǎn)是特殊情況較多,需要考慮完全稻艰。
1.如果字符串前后有空格拆魏,要去除;
2.如果是空串或null雪猪,要特殊處理栏尚;
3.如果頭部有多個正負(fù)號,要特殊處理只恨;
4.如果數(shù)值超出int的范圍译仗,要特殊處理;比int的最大值還要大官觅,已經(jīng)上溢纵菌,這肯定不能通過數(shù)字的大小比較,所以需要在字符串的狀態(tài)下判斷是否上溢或下溢休涤。
5.遇到非數(shù)字的字符咱圆,則轉(zhuǎn)換停止;
剛剛發(fā)現(xiàn)一個新的情況未做處理功氨,在數(shù)字之前有多個0,如果0之后的數(shù)字有溢出情況序苏,而前面的0又沒有去處,這種溢出就不會被捕獲捷凄,還缺這個情況的判斷忱详。這種思路真心不好,一條主線是轉(zhuǎn)換成整數(shù)跺涤,中間穿插出很多特殊情況的分支匈睁,感覺就像在打補(bǔ)丁。

package chapter7;

/**
 * Created with IntelliJ IDEA
 * Author: ryder
 * Date  : 2017/8/22
 * Time  : 16:06
 * Description:把字符串轉(zhuǎn)換成整數(shù)
 **/
public class P318_StringToInt {
//    atoi的需求是這樣的:
//    如果前面有空格桶错,需要剔除空格航唆;
//    剔除空格后,第一個字符串如果是+號院刁,認(rèn)為是正數(shù)糯钙;如果是-號,認(rèn)為是負(fù)數(shù)黎比;
//    后面的字符如果不是數(shù)字超营,那么返回0,如果是數(shù)字阅虫,返回實(shí)際的數(shù)字演闭。遇到不是數(shù)字的字符,轉(zhuǎn)換結(jié)束颓帝。
//    此外米碰,要考慮空串問題窝革,數(shù)值溢出問題[2^(-31) ~ 2^31-1]。

    public static int strToInt(String str) throws Exception{
        if(str==null || str.length()==0)
            throw new Exception("待轉(zhuǎn)換字符串為null或空串");
        String MAX_INT_PLUS_1 = Integer.toString(Integer.MIN_VALUE).substring(1);
        StringBuilder stringBuilder = new StringBuilder(str.trim());
        int flag = 0; //記錄無符號的正(2)正(1)吕座,負(fù)(-1),初始值(0)
        if(stringBuilder.charAt(0)=='-')
            flag = -1;
        else if(stringBuilder.charAt(0)=='+')
            flag = 1;
        else if(stringBuilder.charAt(0)>='0'&&stringBuilder.charAt(0)<='9')
            flag = 2;
        else
            return 0;
        int endIndex = 1;
        while (endIndex<stringBuilder.length()&&stringBuilder.charAt(endIndex)>='0'&&stringBuilder.charAt(endIndex)<='9')
            endIndex++;
        if(flag==2){
            if(stringBuilder.substring(0,endIndex).toString().compareTo(MAX_INT_PLUS_1)>=0)
                throw new Exception("數(shù)值上溢,待轉(zhuǎn)換字符串為"+str);
            return Integer.parseInt(stringBuilder.substring(0,endIndex));
        }
        else{
            if(flag==1&&stringBuilder.substring(1,endIndex).compareTo(MAX_INT_PLUS_1)>=0)
                throw new Exception("數(shù)值上溢,待轉(zhuǎn)換字符串為"+str);
            if(flag==-1&&stringBuilder.substring(1,endIndex).compareTo(MAX_INT_PLUS_1)>0)
                throw new Exception("數(shù)值下溢,待轉(zhuǎn)換字符串為"+str);
            if(flag==-1&&stringBuilder.substring(1,endIndex).compareTo(MAX_INT_PLUS_1)==0)
                //此處注意虐译,此種情況不能用絕對值*(-1),該絕對值已經(jīng)超出正數(shù)的最大值
                return Integer.MIN_VALUE;
            return flag*Integer.parseInt(stringBuilder.substring(1,endIndex));
        }
    }

    public static void funcTest(){
        try {
        System.out.println(strToInt(" 100")); //100
        System.out.println(strToInt("-100")); //-100
        System.out.println(strToInt("0")); //0
        System.out.println(strToInt("-0"));//0
        System.out.println(strToInt("1.23"));  //1
        System.out.println(strToInt("-1.23")); //-1
        System.out.println(strToInt(".123"));  //0
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
    public static void edgeTest(){
        try {
            System.out.println(strToInt("2147483647"));  //2147483647
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
        try {
            System.out.println(strToInt("-2147483647")); //-2147483647
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
        try {
            System.out.println(strToInt("2147483647"));  //2147483647
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
        try {
            System.out.println(strToInt("2147483648"));  //上溢
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
        try {
            System.out.println(strToInt("-2147483648")); //-2147483648
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
        try {
            System.out.println(strToInt("-2147483649")); //下溢
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
        try {
            System.out.println(strToInt(null)); //待轉(zhuǎn)換字符串為null或空串
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
        try {
            System.out.println(strToInt(""));   //待轉(zhuǎn)換字符串為null或空串
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
    public static void main(String[] args){
        funcTest();
        edgeTest();
    }
}

運(yùn)行結(jié)果

100
-100
0
0
1
-1
0
2147483647
-2147483647
2147483647
數(shù)值上溢,待轉(zhuǎn)換字符串為2147483648
-2147483648
數(shù)值下溢,待轉(zhuǎn)換字符串為-2147483649
待轉(zhuǎn)換字符串為null或空串
待轉(zhuǎn)換字符串為null或空串
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吴趴,一起剝皮案震驚了整個濱河市漆诽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锣枝,老刑警劉巖厢拭,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撇叁,居然都是意外死亡供鸠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門陨闹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楞捂,“玉大人,你說我怎么就攤上這事趋厉≌郑” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵君账,是天一觀的道長鼻忠。 經(jīng)常有香客問我,道長杈绸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任矮瘟,我火速辦了婚禮瞳脓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘澈侠。我一直安慰自己劫侧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布哨啃。 她就那樣靜靜地躺著烧栋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拳球。 梳的紋絲不亂的頭發(fā)上审姓,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音祝峻,去河邊找鬼魔吐。 笑死扎筒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酬姆。 我是一名探鬼主播嗜桌,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辞色!你這毒婦竟也來了骨宠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤相满,失蹤者是張志新(化名)和其女友劉穎层亿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雳灵,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棕所,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悯辙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳省。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖躲撰,靈堂內(nèi)的尸體忽然破棺而出针贬,到底是詐尸還是另有隱情,我是刑警寧澤拢蛋,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布桦他,位于F島的核電站,受9級特大地震影響谆棱,放射性物質(zhì)發(fā)生泄漏快压。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一垃瞧、第九天 我趴在偏房一處隱蔽的房頂上張望蔫劣。 院中可真熱鬧,春花似錦个从、人聲如沸脉幢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫌松。三九已至,卻和暖如春奕污,著一層夾襖步出監(jiān)牢的瞬間萎羔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工碳默, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留外驱,地道東北人育灸。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像昵宇,于是被迫代替她去往敵國和親磅崭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 字符串轉(zhuǎn)換成整數(shù) 題目描述: 輸入一個由數(shù)字組成的字符串瓦哎,把它轉(zhuǎn)換成整數(shù)并輸出砸喻。例如:輸入字符串"123",輸出整...
    MinoyJet閱讀 1,189評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法蒋譬,類相關(guān)的語法割岛,內(nèi)部類的語法,繼承相關(guān)的語法犯助,異常的語法癣漆,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 一、字符串操作 strcpy(p, p1) 復(fù)制字符串 strncpy(p, p1, n) 復(fù)制指定長度字符串 s...
    JaiUnChat閱讀 1,653評論 0 7
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,212評論 0 4
  • 2017年9月 我從中國最西南 來到中國的最東南 可能是上天眷顧 讓我來到到我三年來夢寐以求的地方 開始新的生活 ...
    就是莫愁閱讀 259評論 0 2