-
描述:
請你來實作一個 myAtoi(string s) 函數,使其能将字元串轉換成一個 32 位有符号整數(類似 C/C++ 中的 atoi 函數)。
函數 myAtoi(string s) 的算法如下:
讀入字元串并丢棄無用的前導空格
檢查下一個字元(假設還未到字元末尾)為正還是負号,讀取該字元(如果有)。 确定最終結果是負數還是正數。 如果兩者都不存在,則假定結果為正。
讀入下一個字元,直到到達下一個非數字字元或到達輸入的結尾。字元串的其餘部分将被忽略。
将前面步驟讀入的這些數字轉換為整數(即,“123” -> 123, “0032” -> 32)。如果沒有讀入數字,則整數為 0 。必要時更改符号(從步驟 2 開始)。
如果整數數超過 32 位有符号整數範圍 [−231, 231 − 1] ,需要截斷這個整數,使其保持在這個範圍内。具體來說,小于 −231 的整數應該被固定為 −231 ,大于 231 − 1 的整數應該被固定為 231 − 1 。
傳回整數作為最終結果。
注意:
本題中的空白字元隻包括空格字元 ’ ’ 。
除前導空格或數字後的其餘字元串外,請勿忽略 任何其他字元
- 執行個體:
輸入:s = “42”
輸出:42
解釋:加粗的字元串為已經讀入的字元,插入符号是目前讀取的字元。
第 1 步:“42”(目前沒有讀入字元,因為沒有前導空格)
^
第 2 步:“42”(目前沒有讀入字元,因為這裡不存在 ‘-’ 或者 ‘+’)
^
第 3 步:“42”(讀入 “42”)
^
解析得到整數 42 。
由于 “42” 在範圍 [-231, 231 - 1] 内,最終結果為 42 。
- 小結:
- 整體思路:去空格(記得排除,全部是空格的極端情況)->判斷正負号->開始正式把字元串轉換為整數(記得排除溢出的情況和非數字的情形)
- 實用tips:第一:字元串轉數字的算法:
, 數字,左移的方法:int temp = 0, temp = temp * 10 + num
, 數字彈出末位:x /= 10
x %= 10
- 代碼:
class Solution {
public int myAtoi(String s) {
if (s == null || s.length() == 0) return 0;
char[] arr = s.toCharArray();
int index = 0;
while (index < arr.length && arr[index] == ' ') {
index++;
}
if (index >= arr.length) {
return 0;
}
int sign = 1;
if (arr[index] == '-' || arr[index] == '+') {
if (arr[index] == '-') {
sign = -1;
}
index++;
}
int res = 0;
int temp = 0;
while (index < arr.length) {
int num = arr[index] - '0';
if (num > 9 || num < 0) break;
temp = 10 * temp + num;
if (temp/10 != res) {
if (sign == 1) {
return Integer.MAX_VALUE;
} else {
return Integer.MIN_VALUE;
}
}
res = temp;
index++;
}
return res*sign;
}
}