Leetcode 08 字符串转整数 (c++和python)

题目描述:

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

(1)读入字符串并丢弃无用的前导空格
(2)检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
(3)读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
(4)将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
(5)如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
(6)返回整数作为最终结果。
注意:

本题中的空白字符只包括空格字符 ' ' 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

说明:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31,  2^31 − 1]。如果数值超过可表示的范围,则返回  INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。

示例 1:

输入: "42"
输出: 42

示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。

示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。

提示:

  • 0 <= s.length <= 200
  • s 由英文字母(大写和小写)、数字(0-9)、' ''+''-' 和 '.' 组成

C++代码: 

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗:6.9 MB, 在所有 C++ 提交中击败了53.01%的用户

class Solution {
public:
    int myAtoi(std::string s) {
        // 空格问题 丢弃无用的前导空格
        int i = 0;
        while (i < s.size() && s[i] == ' ') i++;

        // 正负问题
        bool is_postive = true;
        if (s[i] == '-' || s[i] == '+')  // 有符号位,则移动i,否则就是直接数字
            is_postive = s[i++] == '-'?false:true;
            
        // 累加, 读数,中间如果越界则及时返回。 减去字符0,也就是减去0的ASCII码值48,数字字符减去‘0’就得到了该数字。
        long ans = 0;
        // 不在这个范围,比如字母开头的不进入循环,结果为0
        while (i < s.size() && (0 <= s[i] - '0' && s[i] - '0'<= 9)) 
        {
            ans = ans * 10 + s[i++] - '0';
            if (is_postive && ans>INT_MAX) return INT_MAX;
            if (!is_postive && -ans < INT_MIN) return INT_MIN;
        }
        return is_postive?ans:-ans;
    }
};

python代码:

class Solution(object):
    def myAtoi(self, s):
        """
        :type s: str
        :rtype: int
        """
        if len(s) == 0: return 0

        is_p = True
        # 第一个数字位置
        begin = -1
        i = 0
        # 如果是空格,继续;如果是符号位,返回下一个位置;如果是数字位,则返回当前位置
        for i in range(len(s)):
            if s[i] == " ":
                continue
            elif s[i] == "-" or s[i] == "+":
                begin = i + 1
                if s[i] == "-":
                    is_p = False
                break  # 后面还有符号位,则返回0: "+-12"
            elif s[i].isdigit():
                begin = i
                break
            else:
                return 0
        if begin == -1: return 0

        i = begin  # 判断后面的字符
        ans = 0
        while i < len(s) and s[i].isdigit():  # 往后找数字
            ans = ans * 10 + int(s[i])
            if is_p and ans >= 2**31-1:
                return 2**31-1
            elif not is_p and -ans <= -2**31:
                return - 2**31
            i = i + 1

        ans = ans if is_p else -ans
        return ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值