leetcode: String to Integer (atoi)

原题:String to Integer (atoi)

这道题放在leetcode上,多了一些需求,要求处理非法字符,其实是经典的字符串提取操作。

问题要求

一个字符串是合法的,则它的前缀必须是由若干个空格组成的(可以没有),可以有1个正负号(多个也被认为是非法的),正负号紧接着的是0-9的数字,后缀的任何非法字符都不用管。

要求:将合法的字符串转换成int数值,若转换后超过INT的范围,则对应返回其上界或下界;非法字符串统一返回0。

思路

我把解决问题的逻辑分为两部分:
1. 提取合法字符串的数字部分,并确认其正负性,非法字符串则在这个过程中被变成空串;
2. 将提取后的字符串转换成int数值。

提取字符串的过程

直接看代码和注释:

bool isNum(char ch) {
    return (ch >= '0' && ch <= '9');
}

bool isSign(char ch) {
    return (ch == '+') || (ch == '-');
}

bool strip(string& str) {
    int len = str.size(), left = 0, right;
    // 前缀只允许空格,其它非法字符则表示该字符串非法,应返回0
    while (left < len && !isNum(str[left]) && !isSign(str[left])) {
        if (str[left] != ' ') {
            str = "";
            return false;
        }
        ++left;
    }

    // 处理正负号
    bool isNeg = false;
    if (isSign(str[left])) {
        isNeg = str[left] == '-';
        ++left;
    }

    // 后缀的非法字符全部不用管,只看数字就好了
    right = left;
    while (right < len && isNum(str[right]))
        ++right;

    str = str.substr(left, right - left);
    return isNeg;
}

str2int

这里给的参数是处理过后的字符串了,不用担心非法字符,可以专心做转换,有偷懒的方法(用C++的sstream),也有务实的方法。

先声明一下:

static const int INT_MAX_VALUE = 0x7fffffff, INT_MIN_VALUE = 0x80000000;
// 偷懒的方法
int str2int(const string& str, bool isNeg) {
    double num;
    stringstream ss(str);
    ss >> num;
    if (isNeg)
        num = -num;
    if (num > INT_MAX_VALUE)
        return INT_MAX_VALUE;
    if (num < INT_MIN_VALUE)
        return INT_MIN_VALUE;
    return num;
}

务实的方法为:

// 务实的方法
int str2int(const string& str, bool isNeg) {
    long long num = 0;
    for (int i = 0; i < str.size(); ++i) {
        num *= 10;
        num += (int)(str[i] - '0');
        if (!isNeg && num > INT_MAX_VALUE) {
            return INT_MAX_VALUE;
        } else if (isNeg && -num < INT_MIN_VALUE) {
            return INT_MIN_VALUE;
        }
    }

    return isNeg ? -num : num;
}

这里利用了long long的便利,其实可以用int来存放num的,只是要多加一些判断而已!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值