把字串轉換成整數(字串)
阿新 • • 發佈:2019-02-18
題目描述:將一個字串轉換成一個整數,要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是一個合法的數值則返回0。
輸入描述:輸入一個字串,包括數字字母符號,可以為空
輸出描述:如果是合法的數值表達則返回該數字,否則返回0
思路一:
和sum=sum*10+chars[i]-'0'是一樣的。public class Solution { public int StrToInt(String str) { if (str == null || str.length() == 0) return 0; char[] chars = str.toCharArray(); int symbol = 1; if (chars[0] == '-') symbol = -1; int sum = 0; for (int i = (chars[0] == '+' || chars[0] == '-') ? 1:0; i <chars.length; i++) { if (chars[i] < '0' || chars[i] > '9') return 0; else sum = sum * 10 + chars[i] - '0'; } return sum * symbol; } }
左移是乘以2的次方。(sum << 1) + (sum << 3) = sum * 2 + sum * 8 = sum * 10。
字元'0'到'9'的ASCII值的低4個二進位制位剛好就是0到9。
所以,chars[i]&0xf等於chars[i]-'0'。
位運算比乘法運算效率高一點。
public class Solution { public int StrToInt(String str) { if (str == null || str.length() == 0) return 0; char[] chars = str.toCharArray(); int symbol = 1; if (chars[0] == '-') symbol = -1; int sum = 0; for (int i = (chars[0] == '+' || chars[0] == '-') ? 1:0; i <chars.length; i++) { if (chars[i] < '0' || chars[i] > '9') return 0; else sum = (sum << 1) + (sum << 3) + (chars[i] & 0xf); } return sum * symbol; } }
int 範圍-2147483648 到 2147483647
考慮溢位,注意這裡是sum使用long型別。
public class Solution { public static void main(String[] args) { Solution so = new Solution(); String s = "2147483648"; System.out.println(so.StrToInt(s)); //輸出為0 } public int StrToInt(String str) { if (str == null || str.length() == 0) return 0; char[] chars = str.toCharArray(); int symbol = 1; if (chars[0] == '-') symbol = -1; long sum = 0; for (int i = (chars[0] == '+' || chars[0] == '-') ? 1:0; i <chars.length; i++) { if (chars[i] < '0' || chars[i] > '9') return 0; else sum = (sum << 1) + (sum << 3) + (chars[i] & 0xf); if (symbol == 1 && sum > Integer.MAX_VALUE || (symbol == -1 && sum < Integer.MIN_VALUE)) return 0; } return (int)(sum * symbol); } }