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;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/540917.html
標籤:其他
