1. 程式人生 > >49. 把字串轉換成整數

49. 把字串轉換成整數

題目描述:

將一個字串轉換成一個整數(實現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;
    }
};