49. 把字串轉換成整數
阿新 • • 發佈:2019-02-11
題目描述:
將一個字串轉換成一個整數(實現Integer.valueOf(string)的功能,但是string不符合數字要求時返回0),要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是一個合法的數值則返回0。
輸入描述:
輸入一個字串,包括數字字母符號,可以為空
輸出描述:
如果是合法的數值表達則返回該數字,否則返回0
示例1
輸入
+2147483647
1a33
輸出
2147483647
0
思路:如果字串能轉化成符合題意的整數,那麼字串中的字元肯定實在'0' ~'9'之間的,符號 + 或者 - 如果出現的話,那麼肯定是出現的字串的第一個元素的位置,如果出現在字串的中間的某個位置,這個字串就不可以轉化為數字。
再有就是:res = (res << 1) + (res << 3) + (str[i] & 0xf);
對這句話的解釋: (res << 1) + (res << 3),左移一位是乘以2,左移3位是乘以8,加起來相當於res*10;
(str[i] & 0xf) 相當於 str[i] - '0',為什麼呢?因為 字元'0' ~ '9' 的SACII碼值的低四個二進位制位就是 0 ~ 9, 0xf 是數字15,二進位制位1111,這樣操作之後就可以將 ‘0’ 轉化為0,...,將‘9’轉化為‘9’。
整體看這句話:res = res * 10 + str[i] - ‘0’。例如字串為‘123’;
那麼單步執行:res = 1; res = 1 * 10 + 2 = 12; res = 12 * 10 + 3 = 12。這句話就是這個意思。
class Solution { public: int StrToInt(string str) { int len = str.size(); if(len <= 0) return 0; int symbol = 1; long long res = 0; if(str[0] == '-') symbol = -1; for(int i = (str[0] == '+' || str[0] == '-')? 1 : 0; i < len; ++ i) { if(str[i] >= '0' && str[i] <= '9') res = (res << 1) + (res << 3) + (str[i] & 0xf); else return 0; } return res * symbol; } };