題目描述
將一個字符串轉換成一個整數,要求不能使用字符串轉換整數的庫函數。 數值為0或者字符串不是一個合法的數值則返回0。
輸入描述:
輸入一個字符串,包括數字字母符號,可以為空
返回值描述:
如果是合法的數值表達則返回該數字,否則返回0
示例1:
輸入:"+2147483647"
輸出:2147483647
示例2:
輸入:"1a33"
輸出:0
題目鏈接
解題思路
該題目主要有三個方面要注意:
一是判斷第一個字符是否為符號“+” 或 “-”;
二是判斷字符串中間是否有非法字符,即非數字(字母);
三是判斷是否為空字符串;
所以,上來應該先判斷是否為空,以及字符串長度是否小於1;
然后將字符串轉為字符數組,遍歷字符數組,判斷是否有非法字符,即判斷是否合法;
如果不合法則返回0;如果合法則繼續判斷首字符是否是符號,如果是正號(“+”)則將標志位flag置為1,如果是負號(“-”)將標志位置為-1;
然后遍歷數組, res = 10*res+chs[i]-'0'; 這里注意,從數組里獲得的是字符,並不是數字,所以要減去 '0' ,這樣得到的才是真正的數字(0-9)。
最后返回標志位flag*res乘積。
----
以上的思路是一個傳統的思路,其實,還可以進行優化。
比如,可以把判斷是否合法放在計算res結果的這個循環里面,這樣就將兩次遍歷數組減少為只需遍歷一次就行。
還可以標志位判斷也放在循環里。
代碼如下:
public class Solution { public int StrToInt(String str) { if(str.isEmpty()||str.length()<1)//特別注意這里的判斷 return 0; char[] chs = str.toCharArray(); // if(!isLegal(chs)){ // return 0; // } int res = 0; /* int flag = 1; if(chs[0]=='-') flag = -1; else if(chs[0]=='+') flag = 1; else res = chs[0]-'0'; */ for(int i = 0;i<chs.length; i++){ if(chs[i]=='-' || chs[i]=='+') continue; if(chs[i]<'0' || chs[i]>'9') return 0; res = 10*res+chs[i]-'0'; } return chs[0]=='-'?-res:res; }
//該函數在這里沒有用到,只是為了對比第一種思路; public boolean isLegal(char[] chs){ for(int i = 0; i<chs.length; i++){ if(!(chs[i]>='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z')){ return false; } } return true; } }
Over...