leecode刷題(16)-- 字符串轉(zhuǎn)換整數(shù)

leecode刷題(16)-- 字符串轉(zhuǎn)換整數(shù)

字符串轉(zhuǎn)換整數(shù)

描述:

請你來實(shí)現(xiàn)一個(gè) atoi 函數(shù)团甲,使其能將字符串轉(zhuǎn)換成整數(shù)天揖。

首先童叠,該函數(shù)會(huì)根據(jù)需要丟棄無用的開頭空格字符脂信,直到尋找到第一個(gè)非空格的字符為止佣渴。

當(dāng)我們尋找到的第一個(gè)非空字符為正或者負(fù)號(hào)時(shí)齿坷,則將該符號(hào)與之后面盡可能多的連續(xù)數(shù)字組合起來憔鬼,作為該整數(shù)的正負(fù)號(hào);假如第一個(gè)非空字符是數(shù)字胃夏,則直接將其與之后連續(xù)的數(shù)字字符組合起來轴或,形成整數(shù)。

該字符串除了有效的整數(shù)部分之后也可能會(huì)存在多余的字符仰禀,這些字符可以被忽略照雁,它們對于函數(shù)不應(yīng)該造成影響。

注意:假如該字符串中的第一個(gè)非空格字符不是一個(gè)有效整數(shù)字符答恶、字符串為空或字符串僅包含空白字符時(shí)饺蚊,則你的函數(shù)不需要進(jìn)行轉(zhuǎn)換。

在任何情況下悬嗓,若函數(shù)不能進(jìn)行有效的轉(zhuǎn)換時(shí)污呼,請返回 0。

說明:

假設(shè)我們的環(huán)境只能存儲(chǔ) 32 位大小的有符號(hào)整數(shù)包竹,那么其數(shù)值范圍為 [?231, 231 ? 1]燕酷。如果數(shù)值超過這個(gè)范圍籍凝,請返回 INT_MAX (2^31 ? 1) 或 INT_MIN (?2^31) 。

示例 1:

輸入: "42"
輸出: 42

示例 2:

輸入: "   -42"
輸出: -42
解釋: 第一個(gè)非空白字符為 '-', 它是一個(gè)負(fù)號(hào)苗缩。
     我們盡可能將負(fù)號(hào)與后面所有連續(xù)出現(xiàn)的數(shù)字組合起來饵蒂,最后得到 -42 。

示例 3:

輸入: "4193 with words"
輸出: 4193
解釋: 轉(zhuǎn)換截止于數(shù)字 '3' 酱讶,因?yàn)樗南乱粋€(gè)字符不為數(shù)字退盯。

示例 4:

輸入: "words and 987"
輸出: 0
解釋: 第一個(gè)非空字符是 'w', 但它不是數(shù)字或正、負(fù)號(hào)泻肯。
     因此無法執(zhí)行有效的轉(zhuǎn)換渊迁。

示例 5:

輸入: "-91283472332"
輸出: -2147483648
解釋: 數(shù)字 "-91283472332" 超過 32 位有符號(hào)整數(shù)范圍。 
     因此返回 INT_MIN (?231) 灶挟。

思路:

這道題其實(shí)就是多個(gè)條件判斷:

  1. 判斷字符串開頭是否是空格字符琉朽;
  2. 判斷是否存在除了 -+ 的非數(shù)字字符;
  3. 如果有正負(fù)的話執(zhí)行正負(fù)判斷
  4. 判斷數(shù)值是否發(fā)生溢出膏萧。

當(dāng)我們執(zhí)行了這些判斷后漓骚,只需要定義一個(gè)初始值 base = 0蝌衔,定義數(shù)組下標(biāo) i榛泛,從前往后遍歷,將遍歷到的符合條件的字符依次排序噩斟,便能將字符串轉(zhuǎn)換為整數(shù)了曹锨。

代碼如下:

class Solution {
    public int myAtoi(String str) {
        if(str == null || str.length() == 0) {
            return 0;
        }
        //正負(fù)號(hào)判斷,轉(zhuǎn)換值剃允,索引位數(shù)
        int sign = 1, base = 0, i = 0;
        //剔除開始空白字符
        while(i < str.length() && str.charAt(i) == ' '){
            i++;
        }
        //判斷正負(fù)號(hào)
        if(i < str.length() && (str.charAt(i) == '-' || str.charAt(i) == '+')){
            sign = str.charAt(i++) == '-' ? -1 : 1;
        }
        //索引有效數(shù)字字符
        while(i < str.length() && str.charAt(i) >= '0' && str.charAt(i) <= '9'){
            if(base > Integer.MAX_VALUE / 10 || (base == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' > 7)){
                return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            //計(jì)算轉(zhuǎn)換值
            base = 10 * base + (str.charAt(i++) - '0');
        }
        //計(jì)算結(jié)果值
        return base * sign;
    }
}

解釋:

這里我們需要在每個(gè)判斷語句中加入 i < str.length() 沛简,不然通不過 Leecode 提交。

然后代碼中的單引號(hào)不能換成雙引號(hào)斥废,意義不一樣椒楣,單引號(hào)引的數(shù)據(jù)是 char 類型,雙引號(hào)引的數(shù)據(jù)是 string 類型牡肉。

然后可以看到代碼中有base = 10 * base + (str.charAt(i++) - '0'); 這樣的捧灰,其中的 - 代表ascii轉(zhuǎn)換,將字符轉(zhuǎn)換為數(shù)字统锤。

最后我們看一下數(shù)值溢出這塊毛俏,其實(shí)我在之前的博文中有寫:leecode刷題(12)-- 整數(shù)反轉(zhuǎn)

假設(shè) base為正數(shù)饲窿,如果 base = 10 * base + (str.charAt(i++) - '0') 發(fā)生溢出煌寇,那么一定有 base >= INT_MAX / 10 。

同樣的逾雄,當(dāng) base為負(fù)數(shù)時(shí)阀溶,rev <= INT_MIN / 10 會(huì)發(fā)生溢出腻脏。

同時(shí)我們需要注意 (str.charAt(i++) - '0') 的數(shù)值,題目中整數(shù)的數(shù)值范圍為 [?2^31, 2^31 ? 1]淌哟,2^31-1=2147483647, -2^31=-2147483648迹卢,注意最后一位數(shù),即 7 = INT_MAX % 10, 8 = INT_MIN % 10徒仓。

這里我們默認(rèn)判斷數(shù)值是否超出整數(shù)的最大值范圍就好了(假設(shè)是正整數(shù))腐碱,如果有,判斷正負(fù)掉弛,正數(shù)返回 INT_MAX症见,負(fù)數(shù)返回 INT_MIN。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末殃饿,一起剝皮案震驚了整個(gè)濱河市谋作,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乎芳,老刑警劉巖谨读,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憾赁,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)爹脾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門皆的,熙熙樓的掌柜王于貴愁眉苦臉地迎上來相嵌,“玉大人咨油,你說我怎么就攤上這事≡冢” “怎么了友扰?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庶柿。 經(jīng)常有香客問我村怪,道長,這世上最難降的妖魔是什么浮庐? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任甚负,我火速辦了婚禮,結(jié)果婚禮上兔辅,老公的妹妹穿的比我還像新娘腊敲。我一直安慰自己,他們只是感情好维苔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布碰辅。 她就那樣靜靜地躺著,像睡著了一般介时。 火紅的嫁衣襯著肌膚如雪没宾。 梳的紋絲不亂的頭發(fā)上凌彬,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音循衰,去河邊找鬼铲敛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛会钝,可吹牛的內(nèi)容都是我干的伐蒋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼迁酸,長吁一口氣:“原來是場噩夢啊……” “哼先鱼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奸鬓,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤焙畔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后串远,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宏多,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年澡罚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伸但。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡始苇,死狀恐怖砌烁,靈堂內(nèi)的尸體忽然破棺而出筐喳,到底是詐尸還是另有隱情催式,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布避归,位于F島的核電站荣月,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梳毙。R本人自食惡果不足惜哺窄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望账锹。 院中可真熱鬧萌业,春花似錦、人聲如沸奸柬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廓奕。三九已至抱婉,卻和暖如春档叔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒸绩。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工衙四, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人患亿。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓传蹈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親步藕。 傳聞我的和親對象是個(gè)殘疾皇子卡睦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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