JZ67 把字元串轉換成整數(atoi) 題目 寫一個函數 StrToInt,實現把字元串轉換成整數這個功能。不能使用 atoi 或者其他類似的庫函數。傳入的字元串可能有以下部分組成: 1.若幹空格 2.(可選)一個符號字元('+' 或 '-') 3. 數字,字母,符號,空格組成的字元串表達式 4. ...
JZ67 把字元串轉換成整數(atoi)
題目
寫一個函數 StrToInt,實現把字元串轉換成整數這個功能。不能使用 atoi 或者其他類似的庫函數。傳入的字元串可能有以下部分組成:
1.若幹空格
2.(可選)一個符號字元('+' 或 '-')
3. 數字,字母,符號,空格組成的字元串表達式
4. 若幹空格
轉換演算法如下:
1.去掉無用的前導空格
2.第一個非空字元為+或者-號時,作為該整數的正負號,如果沒有符號,預設為正數
3.判斷整數的有效部分:
3.1 確定符號位之後,與之後面儘可能多的連續數字組合起來成為有效整數數字,如果沒有有效的整數部分,那麼直接返回0
3.2 將字元串前面的整數部分取出,後面可能會存在存在多餘的字元(字母,符號,空格等),這些字元可以被忽略,它們對於函數不應該造成影響
3.3 整數超過 32 位有符號整數範圍 [−231, 231 − 1] ,需要截斷這個整數,使其保持在這個範圍內。具體來說,小於 −231的整數應該被調整為 −231 ,大於 231 − 1 的整數應該被調整為 231 − 1
4.去掉無用的後導空格
方法 位運算
思路
演算法實現
既然是將字元串轉化為數字,那我們可以遍歷字元串,一個字元串,一個字元地檢查,然後取出掉無用的,取出數字,利用如下代碼,一個數字一個數字地轉換,前面的擴大十倍加上後面一位。
res = res * 10 + sign * (c - '0');
具體做法:
step 1:遍歷字元串,用index記錄全程的下標。
step 2:首先要排除空串,然後越過前導空格,以及前導空格後什麼都沒有就返回0.
step 3:然後檢查符號,沒有符號預設為正數。
step 4:再在後續遍歷的時候,將數字字元轉換成字元,遇到非數字則結束轉換。
step 5:與Int型最大最小值比較,檢查越界情況。
代碼
package mid.JZ67把字元串轉換成整數;
import java.util.*;
public class Solution {
/**
* 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可
*
*
* @param s string字元串
* @return int整型
*/
public int StrToInt (String s) {
// write code here
if (s.isEmpty()) return 0;
int res = 0;
int index = 0;
while(index < s.length()) {
if (s.charAt(index) == ' ')
index++;
else
break;;
}
//去掉空格就沒了
if (index == s.length()) return 0;
int sign = 1;
//處理第一個符號是正負號的情況
if (s.charAt(index) == '+')
index++;
else if (s.charAt(index) == '-'){
sign = -1;
index++;
}
//去掉符號就什麼都沒有了
if(index == s.length())
return 0;
while(index < s.length()) {
char c = s.charAt(index);
if (c < '0' || c > '9') {
break;
}
//處理越界
if(res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (c - '0') > Integer.MAX_VALUE % 10))
return Integer.MAX_VALUE;
if(res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (c - '0') > -(Integer.MIN_VALUE % 10)))
return Integer.MIN_VALUE;
res = res * 10 + sign * (c - '0');
index++;
}
return res;
}
}