【leetcode】String to Integer (atoi)

來源:互聯網
上載者:User

Question :

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

Anwser 1 :   

class Solution {public:    int atoi(const char *str) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        long long ret = 0;                const char *p = str;                while(*p == ' ') p++;                bool valid = true;        while(valid && *p == '+') {            valid = false;            p++;        }                while(*p == '0') p++;                bool minus = false;        if(*p == '-'){            minus = true;            p++;        }                while(*p != '/0'){            if(*p >= '0' && *p <='9'){                ret = ret * 10 + *p - '0';                if(!minus && ret > INT_MAX) return INT_MAX; // positive and overflow                if(minus && -ret < INT_MIN) return INT_MIN; // negative and overflow                p++;            } else {        // no digit then break                break;            }        }                return minus ? -ret : ret;    }};

注意點: 

1) 結果變數 ret 設為了長整形(long long),防止溢出; 最後結果由長整形自動截取為整形(int),返回

2) 計算得到結果時,需要配合正負符號判斷是否已經越界,越界溢出後直接返回

Anwser 2 :        

class Solution { public:     int atoi(const char *str) {         // Start typing your C/C++ solution below         // DO NOT write int main() function         assert(str != NULL);                  while(isspace(*str)) str++;  // remove ' '                                   int sign = (*str == '-') ? -1 : 1;                  if (*str == '-' || *str == '+')    // if can check one char             str++;                      int ret = 0;         while(isdigit(*str))   // is digit         {             int digit = *str - '0';                          if (INT_MAX / 10 >= ret)                 ret *= 10;             else                 return sign == -1 ? INT_MIN : INT_MAX;                              if (INT_MAX - digit >= ret)                 ret += digit;             else                 return sign == -1 ? INT_MIN : INT_MAX;                              str++;         }                  return ret * sign;     } };

注意點:

1) 結果類型為整形(int),不需要轉化,非常好!

2) 對空格(‘ ’)、數字(isdigit)都直接調用函數,非常簡潔!

3) 對溢出全部採用減法(-)判斷,有效預防了加法運算可能的溢出問題,非常值得借鑒!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.