請你來實現(xiàn)一個 atoi 函數(shù),使其能將字符串轉(zhuǎn)換成整數(shù)。
首先,該函數(shù)會根據(jù)需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止。接下來的轉(zhuǎn)化規(guī)則如下:
如果第一個非空字符為正或者負號時,則將該符號與之后面盡可能多的連續(xù)數(shù)字字符組合起來,形成一個有符號整數(shù)。
假如第一個非空字符是數(shù)字,則直接將其與之后連續(xù)的數(shù)字字符組合起來,形成一個整數(shù)。
該字符串在有效的整數(shù)部分之后也可能會存在多余的字符,那么這些字符可以被忽略,它們對函數(shù)不應該造成影響。
注意:假如該字符串中的第一個非空格字符不是一個有效整數(shù)字符、字符串為空或字符串僅包含空白字符時,則你的函數(shù)不需要進行轉(zhuǎn)換,即無法進行有效轉(zhuǎn)換。
在任何情況下,若函數(shù)不能進行有效的轉(zhuǎn)換時,請返回 0 。
提示:
本題中的空白字符只包括空格字符 ' ' 。
假設我們的環(huán)境只能存儲 32 位大小的有符號整數(shù),那么其數(shù)值范圍為 [?2^31, 2^31 ? 1]。如果數(shù)值超過這個范圍,請返回 INT_MAX (2^31 ? 1) 或 INT_MIN (?2^31) 。
示例 1:
輸入: "42"輸出: 42
示例 2:
輸入: " -42"輸出: -42解釋: 第一個非空白字符為 '-', 它是一個負號。 我們盡可能將負號與后面所有連續(xù)出現(xiàn)的數(shù)字組合起來,最后得到 -42 。
示例 3:
輸入: "4193 with words"輸出: 4193解釋: 轉(zhuǎn)換截止于數(shù)字 '3' ,因為它的下一個字符不為數(shù)字。
示例 4:
輸入: "words and 987"輸出: 0解釋: 第一個非空字符是 'w', 但它不是數(shù)字或正、負號。 因此無法執(zhí)行有效的轉(zhuǎn)換。
示例 5:
輸入: "-91283472332"輸出: -2147483648解釋: 數(shù)字 "-91283472332" 超過 32 位有符號整數(shù)范圍。 因此返回 INT_MIN (?231) 。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/string-to-integer-atoi
著作權(quán)歸領扣網(wǎng)絡所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
atoi:ascii to integer
C和C#庫有自帶的atoi函數(shù),但是Java并沒有,Java中與之相似的是Integer的 parseInt()系列方法,是雙參方法,多進制的轉(zhuǎn)化,可以看源碼了解下;
步驟:
使用String的trim()方法對原字符串兩端的空白字符預處理;
判斷與處理后字符長度,必須大于1才能繼續(xù),先取低一個字符對+和-情況處理;
依次逐個字符轉(zhuǎn)化,注意溢出判斷處理;
總結(jié):atoi的轉(zhuǎn)換并不難,唯一需要注意的溢出判斷的邏輯
package leetcode;/** * @author ZhouJie * @date 2019年12月10日 下午6:13:52 * @Description:8. 字符串轉(zhuǎn)換整數(shù) (atoi) * */public class LeetCode_0008 { public static void main(String[] args) { Solution_0008 solution_0008 = new Solution_0008(); System.out.println(solution_0008.myAtoi("2147483648")); Double.valueOf("53454.sdrf"); }}class Solution_0008 { /** * @author ZhouJie * @date 2019年12月10日 下午7:00:52 * @Description: TODO(方法簡述) * @return int * @UpdateUser-UpdateDate:[ZhouJie]-[2019年12月10日 下午7:00:52] * @UpdateRemark:1-思路: * -先trim()左右去空并再次驗非空; * -校驗首字符是+-的情況 * -逐個取字符轉(zhuǎn)化數(shù)字并校驗是否溢出 */ public int myAtoi(String str) { if (str == null) { return 0; } // 去除左右空白字符,且去除后長度不能為0 str = str.trim(); int len = str.length(); if (len < 1) { return 0; } int flag = 1; int i = 0; char c = str.charAt(0); // 首個字符為+或-的預處理,同時記錄符號 if (c == '-' || c == '+') { i = 1; if (c == '-') { flag = -1; } } int rst = 0; int check = 0; // 逐個字符轉(zhuǎn)化,每次/10與上一次的值校驗用以判斷是否溢出 for (; i < len; i++) { int num = str.charAt(i) - '0'; if (num >= 0 && num <= 9) { rst = rst * 10 + num * flag; // 溢出校驗,若本次結(jié)果已溢出,那么當前值/10必不等于上一次的值,利用溢出去校驗溢出,巧妙 if (rst / 10 != check) { return flag == 1 ? ((1 << 31) - 1) : (-1 << 31); } check = rst; } else { return rst; } } return rst; }}