700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > c++ 32位有符号的整数_【LeetCode】字符串分类字符串转换整数 (atoi)

c++ 32位有符号的整数_【LeetCode】字符串分类字符串转换整数 (atoi)

时间:2022-11-06 07:32:17

相关推荐

c++ 32位有符号的整数_【LeetCode】字符串分类字符串转换整数 (atoi)

“摘要:本文主要讲述LeetCode字符串分类字符串转换整数 (atoi)解法。主要内容如下:

题目

示例

解题

01

题目

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

02

示例

示例 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) 。示例 6:输入: " -4193 with words"输出: -4193

03

解题思路

算法推演:

算法中还要注意一点,本题涉及整数的运算,我们需要注意溢出。对于溢出的处理方式通常可以转换为 INT_MAX 的逆操作。比如判断某数乘 10 是否会溢出,那么就把该数和 INT_MAX 除 10 进行比较。

实现代码

class Solution {public: int myAtoi(std::string s) {// 变量定义 long long ans = 0; int sign = 1; // 1.去掉前导空格 int spaceEndPos = (int)s.find_first_not_of(" "); int strLen = 0; char* sptr = nullptr; if (spaceEndPos == std::string::npos) {sptr = const_cast<char*>(s.c_str()); strLen = (int)s.length(); } else {sptr = const_cast<char*>(s.c_str()) + spaceEndPos; strLen = (int)s.length() - spaceEndPos; } if (strLen <= 0) {return 0; }// 2.判断第一个字符是否是符号位 if(sptr[0] == '-') {sign = -1; } else if (sptr[0] == '+') {sign = 1; } else if (!isdigit(sptr[0])) {return 0; } else {ans = ans * 10 + (sptr[0] - '0'); } ++sptr; --strLen;// 3.获取所有数字 for(int i = 0; i < strLen; ++i) {if(isdigit(sptr[i])) {long long temp = ans * 10 + (sptr[i] - '0');if (temp > INT_MAX) {temp = (sign == 1 ? INT_MAX : -((long long)INT_MIN));ans = temp;break;} else {ans = temp;} } else {break; } } return int(sign * ans); }};

复杂度分析

时间复杂度: O(n) ,要遍历整个字符串

空间复杂度: O(1)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。