leetcode 8.字符串转换整数

这题目,两种典型的思路,第一种,直接按照题目要求来做就好了。把前面的空格符跳过,处理±符号,然后将数字字符不断累加转换即可。

关键的一个点是如何判断溢出问题,用来记录答案的中间变量可以定义为long long变量(注意long和int都是四字节,usigned int也是不可取的,范围仍旧不满足要求。直接用longlong省时省力)

自己的实现代码如下

class Solution {
public:
    int myAtoi(string str) {
        if(str.length()==0)
            return 0;
        int begin=0;
        while(str[begin]==' '&&begin<str.length())
            begin++;
        if(begin==str.length())return 0;
        bool flag= false;
        if(str[begin]=='-'){
            begin++;
            flag=true;
        } else if (str[begin]=='+'){
            begin++;
        } else if (str[begin]>'9'||str[begin]<'0'){
            return 0;
        }
        long long ans=0;
        while (str[begin]<='9'&&str[begin]>='0'&&begin<str.length()){
            ans=ans*10+(str[begin]-'0');
            if(!flag&&ans>=INT_MAX)return INT_MAX;
            else if(flag&&ans-1>=INT_MAX)return INT_MIN;
            begin++;
        }
        if (flag) return 0-ans;
        else return ans;
    }
};

 

当然啦,如果学过正则表达式的人,应该都能想到用正则表达式直接把有效字符串提取出来,,,

但是我比较久没有用正则表达式(只在编译原理里面认真学过哈哈),确实一下想要上手有难度。

反正平常工作直接用轮子了,谁还去造。

正则表达式实现代码如下(python代码)。

class Solution:
    def myAtoi(self, s: str) -> int:
        return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
  • 使用正则表达式 ^:匹配字符串开头,[\+\-]:代表一个+字符或-字符,?:前面一个字符可有可无,\d:一个数字,+:前面一个字符的一个或多个,\D:一个非数字字符
  • max(min(数字, 2**31 - 1), -2**31) 用来防止结果越界
posted @ 2020-08-28 11:57  布羽  阅读(187)  评论(0)    收藏  举报