前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一道leetcode:8. 字符串转换整数 (atoi)

每日一道leetcode:8. 字符串转换整数 (atoi)

作者头像
felixzhao
发布2023-04-06 11:51:45
3690
发布2023-04-06 11:51:45
举报
文章被收录于专栏:null的专栏null的专栏

1. 题目(中等)

题目链接

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

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

读入字符串并丢弃无用的前导空格

检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。

读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。

如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。

返回整数作为最终结果。

注意:

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

示例 1:

输入:s = “42” 输出:42 解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。 第 1 步:“42”(当前没有读入字符,因为没有前导空格) 第 2 步:“42”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’) 第 3 步:“42”(读入 “42”) 解析得到整数 42 。 由于 “42” 在范围 [-231, 231 - 1] 内,最终结果为 42 。

示例 2:

输入:s = " -42" 输出:-42 解释: 第 1 步:" -42"(读入前导空格,但忽视掉) 第 2 步:" -42"(读入 ‘-’ 字符,所以结果应该是负数) 第 3 步:" -42"(读入 “42”) 解析得到整数 -42 。 由于 “-42” 在范围 [-231, 231 - 1] 内,最终结果为 -42 。

示例 3:

输入:s = “4193 with words” 输出:4193 解释: 第 1 步:“4193 with words”(当前没有读入字符,因为没有前导空格) 第 2 步:“4193 with words”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’) 第 3 步:“4193 with words”(读入 “4193”;由于下一个字符不是一个数字,所以读入停止) 解析得到整数 4193 。 由于 “4193” 在范围 [-231, 231 - 1] 内,最终结果为 4193 。

提示:

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

2. 分析与解答

思路:字符串解析。分情况:

  • 去除字符串开始的空格
  • 判断正负号
  • 逐个判断是否为数字并将其转换成数字,注意判断是否越界

注意:中间遇到空格也是要退出的情形

代码:

代码语言:javascript
复制
class Solution {
public:
    int myAtoi(string s) {
        int n = s.length();
        int res = 0;
        int index = 0;
        // 去除前置空格
        while (index < n) {
            if (s[index] == ' ') index++;
            else break;
        }
        // 从第一个非空格开始,判断是否是负数
        int p = 1;
        if (s[index] == '-') {
            p = -1;
            index ++;
        } else if (s[index] == '+') {
            index ++;
        }
        for (int i = index; i < n; i++) {
            if (isdigit(s[i])) {
                int add = s[i]-'0';
                if (res > (INT_MAX - add) / 10) {
                    return p == 1 ? INT_MAX : INT_MIN;
                } else {
                    res = res * 10 + add;
                }
            } else break;
        }
        return res * p;
    }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目(中等)
  • 2. 分析与解答
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档