描述
        将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
        输入一个字符串,包括数字字母符号,可以为空
返回值描述:
        如果是合法的数值表达则返回该数字,否则返回0
示例1
输入:"+2147483647"
返回值:2147483647
请在这里输入引用内容
示例2
输入:"1a33"
返回值:0

方法一:逐个遍历并将字符转数字
        由题意可知输入的字符串转化为整数,而整数的定义只能是数字。而输入的字符串可能包括数字、符号、空格和英文字符。因此当字符串中存在英文字符则不符合题意;而符号位则表示最后的数字是正数还是负数,这里使用一个标志位记录即可;空格字符可以直接跳过;数字字符需要转化为对应的数字,采用ASCII转化即可。

图解:
图片说明

核心代码:(C++)

int StrToInt(string str) {
    int index = 0, flag = 1, len = str.size();   //标志位flag=1为正数;flag=-1为负数
    long long result = 0; 
    while (str[index] == ' ')      //过滤掉字符串前面的空格
        index ++;
    if(str[index] == '-' || str[index] == '+') {    //符号位判断,确定数字的正负
        if(str[index] == '-')      //负数的时候更改标志位
            flag = -1;
        index ++;
    } 

    while(index < len && isdigit(str[index])){      //循环转化字符串的每一位
        result = result * 10 + (str[index] - '0');     //计算的时候刚好是反过来的,比如123,则可以逐步分解为1 => 1*10+2 => (1*10+2)*10+3
        if(result >= INT_MAX && flag == 1)        //超过int的最大范围
            return INT_MAX;
        if(result > INT_MAX && flag == -1)      //小于int的最小范围
            return INT_MIN;
        index++;
    }
    if(index == len)
        return flag * result;
    else     //index<len表明字符串中存在英文字符
        return 0;
}

复杂度分析:
        代码使用了循环,循环次数为数组大小,因此该方法的时间复杂度为O(N)。由于没有采用额外的数组空间,空间复杂度为O(1)

时间复杂度O(n)
空间复杂度O(1)

方法二:采用正则匹配
        使用Python语言编写,采用Python里面的正则表达式解决字符判断和匹配的问题。具体步骤如下
1)首先去掉字符串的空格
2)如果是空字符串则直接返回0,否则进一步处理
3)存在+-标志位,则记录该标志位,并清理标志位
4)如果字符串只有空格和标志位,则直接返回0,否则进一步处理
5)匹配字符串中的英文字符,如果匹配上则不符合题意,直接返回0
6)将数字字符转转化为整型数字,同时根据标志位更新整型数字标志位并返回结果

核心代码:(Python)

def StrToInt(self, s):
    import re
    s = s.strip()    #去掉空格
    if len(s) > 0:
        flag = True
        if s[0] == '-':      #判断标志位
            flag = False
        s = s.strip("+-")     #去掉正负标志位
        if len(s) > 0:
            pattern = re.compile(r'[a-zA-Z]')     #匹配英文字符
            result = re.search(pattern, s)    #该方***扫描整个字符串
            if not result:                   #未匹配上英文字符
                result = int(result)    #将数字字符串转化为数字
                if not flag:          #判断并更新标志位
                    result = -result
                return result
    return 0

复杂度分析:
        代码search函数查找字符串数组,即扫描字符串,相当于遍历数组,因此该方法的时间复杂度为O(N)。由于采用了额外的数组空间,空间复杂度为O(N)

时间复杂度O(n)
空间复杂度O(1)