我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 8. 字元串轉換整數 (atoi) 題目 請你來實現一個 at ...
我的LeetCode:https://leetcode-cn.com/u/ituring/
我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii
LeetCode 8. 字元串轉換整數 (atoi)
題目
請你來實現一個 atoi 函數,使其能將字元串轉換成整數。
首先,該函數會根據需要丟棄無用的開頭空格字元,直到尋找到第一個非空格的字元為止。接下來的轉化規則如下:
- 如果第一個非空字元為正或者負號時,則將該符號與之後面儘可能多的連續數字字元組合起來,形成一個有符號整數。
- 假如第一個非空字元是數字,則直接將其與之後連續的數字字元組合起來,形成一個整數。
- 該字元串在有效的整數部分之後也可能會存在多餘的字元,那麼這些字元可以被忽略,它們對函數不應該造成影響。
註意:假如該字元串中的第一個非空格字元不是一個有效整數字元、字元串為空或字元串僅包含空白字元時,則你的函數不需要進行轉換,即無法進行有效轉換。
在任何情況下,若函數不能進行有效的轉換時,請返回 0 。
提示:
- 本題中的空白字元只包括空格字元 ' ' 。
- 假設我們的環境只能存儲 32 位大小的有符號整數,那麼其數值範圍為 [−2^31, 2^31 − 1]。如果數值超過這個範圍,請返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。
示例 1:
輸入: "42"
輸出: 42
示例 2:
輸入: " -42"
輸出: -42
解釋: 第一個非空白字元為 '-', 它是一個負號。
我們儘可能將負號與後面所有連續出現的數字組合起來,最後得到 -42 。
示例 3:
輸入: "4193 with words"
輸出: 4193
解釋: 轉換截止於數字 '3' ,因為它的下一個字元不為數字。
示例 4:
輸入: "words and 987"
輸出: 0
解釋: 第一個非空字元是 'w', 但它不是數字或正、負號。
因此無法執行有效的轉換。
示例 5:
輸入: "-91283472332"
輸出: -2147483648
解釋: 數字 "-91283472332" 超過 32 位有符號整數範圍。
因此返回 INT_MIN (−231) 。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/string-to-integer-atoi
著作權歸領扣網路所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解題思路
atoi:ascii to integer
C和C#庫有自帶的atoi函數,但是Java並沒有,Java中與之相似的是Integer的 parseInt()系列方法,是雙參方法,多進位的轉化,可以看源碼瞭解下;
思路1-先左右去空白字元,然後校驗首字元為+和-的情況,最後逐個字元進行轉化即可,註意溢出判斷
步驟:
- 使用String的trim()方法對原字元串兩端的空白字元預處理;
- 判斷與處理後字元長度,必須大於1才能繼續,先取低一個字元對+和-情況處理;
- 依次逐個字元轉化,註意溢出判斷處理;
總結:atoi的轉換並不難,唯一需要註意的溢出判斷的邏輯
演算法源碼示例
package leetcode;
/**
* @author ZhouJie
* @date 2019年12月10日 下午6:13:52
* @Description:8. 字元串轉換整數 (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()左右去空並再次驗非空;
* -校驗首字元是+-的情況
* -逐個取字元轉化數字並校驗是否溢出
*/
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;
// 逐個字元轉化,每次/10與上一次的值校驗用以判斷是否溢出
for (; i < len; i++) {
int num = str.charAt(i) - '0';
if (num >= 0 && num <= 9) {
rst = rst * 10 + num * flag;
// 溢出校驗,若本次結果已溢出,那麼當前值/10必不等於上一次的值,利用溢出去校驗溢出,巧妙
if (rst / 10 != check) {
return flag == 1 ? ((1 << 31) - 1) : (-1 << 31);
}
check = rst;
} else {
return rst;
}
}
return rst;
}
}