目录(快速导航)
题目描述
视频讲解 https://www.bilibili.com/video/av66122790/
思路
代码
题目描述:
题目链接:https://leetcode-cn.com/problems/string-to-integer-atoi/
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−,
− 1]。如果数值超过这个范围,请返回 INT_MAX 或 INT_MIN 。
示例 1:
输入: "42"
输出: 42
示例 2:
输入: " -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:
输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
视频讲解
https://www.bilibili.com/video/av66122790/
思路:
这道题挺简单的,我们只需要按照题目要求一步步做即可,需要知道的点:
- char to int 的方式:int a = '4' - '0';因为这里本质上‘4’是char类型,对应ASCII表,它为52,所以不能直接将int a=‘4’,这其实a为52,只有int a=‘4’-‘0’,这是a才为4。
- 注意不要超过int的界限【INT_MIN,INT_MAX】,即【-2147483648,2147483647】。
步骤:
说明:
- 使用isbegin标识是否开始检测数字,初始化为0,表示未开始;
- 使用isnegative标识是否为负数,初始化为0,表示为正数;
- 使用out表示输出的int。
- 遍历str的所有字符c,
- isbegin为0,判断c是否为正负号与空格;正号:标记isbegin为1,负号:标记isbegin为1,isnegative为1,空格:跳过;
- 如果是数字:置isbegin为1,同时分正负数检测out是否溢出,没有溢出就加上值,溢出就用最大的边界值;
- 其余字符,就跳出循环
- 判断out是否为负数,纠正out的正负号
- 输出out
具体细节见代码。
代码:
class Solution {
public:
int myAtoi(string str) {
int isbegin=0; // 标识是否开始检测数字
int isnegative=0; // 标识是否是负数 0表示正数
int out =0;// 输出的结果
// 遍历str的所有字符c
for(char c : str){
// 首先查看是否是数字之前的正负号或者空格 注意:‘+-1’输出0
if (isbegin == 0) {
if (c == '-') {
isnegative = 1;
isbegin = 1;
continue;
} else if (c == '+') {
isbegin = 1;
continue;
} else if (c == ' ') {
continue;
}
}
// 如果是数字
if (isdigit(c) != 0) {
isbegin = 1;
// 是否超过正数最大值
if (isnegative == 0 && ( out > INT_MAX / 10 || (out == INT_MAX / 10 && (c - '0') > 7))) {
out = INT_MAX;
break;
}
// 是否超过负数最大值
else if (isnegative ==1 && (out > INT_MAX / 10 || (out == INT_MAX / 10 && (c - '0') >= 8))) {
out = INT_MIN;
break;
}
out = out * 10 - '0' + c;
continue;
}
// 其余情况 包括:
// 1. 首字符不是空格、正负号、数字
// 2. 第一次出现正负号 之后出现除数字之外的字符
// 3. 数字中间夹杂着除数字之外的字符
else {
break;
}
}
// 检测是否是负数
// 此时out如果是负数 除了负数的最小值INT_MIN在上面直接赋值为负数外
// 其余都为正数,需要添加负号
if (isnegative == 1 && out != INT_MIN) {
out = 0 - out;
}
return out;
}
};
取巧:
class Solution {
public:
int myAtoi(string str) {
int d=0;
istringstream is(str);
is>>d;
return d;
}
};