p96 字符串转换为整数(atoi) (leetcode 8)

一:解题思路

这个题目没有太多复杂的算法,只是考虑以及考察的边界条件较多。

1.可以有前导空格或前导0,但不能有其他前导字符。

2.可能会有一个加号或减号表示正负,也可能没有,连续的多个加号或者减号则视为不合法。

3.紧接着是一段连续的数字,如果没有数字则视为不合法。

4.数字后的其他字符都可以忽略。

5.如果数字大于int的最大值或小于int的最小值,返回相应的极值即可。

6.字符串如果不能合法的转为整数,则返回0.

二:完整代码示例 (C++版和Java版)

C++:

class Solution {
public:
    int myAtoi(string str) 
    {
        int maxValue = 2147483647;
        int minValue =-2147483648;
        int start = 0, p = 0, n = str.size();
        bool negative = false;
        while (p < n && str[p] == ' ') p++;
        if (p == n) return 0;

        if (str[p] == '+')
        {
            p++;
        }
        else if (str[p] == '-')
        {
            p++;
            negative = true;
        }

        while (p < n && str[p] == '0') p++;
        start = p;

        while (p < n && str[p] >= '0' && str[p] <= '9') p++;
        if (p == start) return 0;

        if (p - start > 10)
        {
            if (negative) return minValue;
            else return maxValue;
        }

        long num = 0;
        for (int i = start; i < p; i++)
            num = num * 10 + (str[i]-'0');
        num = negative ? -num : num;

        if (num < minValue) return minValue;
        else if (num > maxValue) return maxValue;
        else return (int)num;
    }
};

Java:

class Solution {
        public int myAtoi(String str) 
        {
               int start=0,p=0,n=str.length();
               boolean negative=false;
               while(p<n && str.charAt(p)==' ') p++;
               if(p==n) return 0;
               
               if(str.charAt(p)=='+')
               {
                   p++;
               }
               else if(str.charAt(p)=='-')
               {
                   p++;
                   negative=true;
               }
               
               while(p<n && str.charAt(p)=='0') p++;
               start=p;
               
               while(p<n && str.charAt(p)>='0' && str.charAt(p)<='9') p++;
               if(p==start) return 0;
               
               if(p-start>10)
               {
                   if(negative) return Integer.MIN_VALUE;
                   else return Integer.MAX_VALUE;
               }
               
               long num=0;
               for(int i=start;i<p;i++)
                   num=num*10+(str.charAt(i)-'0');
               num=negative?-num:num;
               
               if(num<Integer.MIN_VALUE) return Integer.MIN_VALUE;
               else if(num>Integer.MAX_VALUE) return Integer.MAX_VALUE;
               else return (int)num;
        }
    }

 

上一篇:itoa()和atoi()函数详解


下一篇:Zabbix部署、监测及邮件报警机制(实战!)