Fetch the repository succeeded.
/*
请你来实现一个 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 。
示例 4:
输入:s = "words and 987"
输出:0
解释:
第 1 步:"words and 987"(当前没有读入字符,因为没有前导空格)
^
第 2 步:"words and 987"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
^
第 3 步:"words and 987"(由于当前字符 'w' 不是一个数字,所以读入停止)
^
解析得到整数 0 ,因为没有读入任何数字。
由于 0 在范围 [-231, 231 - 1] 内,最终结果为 0 。
示例 5:
输入:s = "-91283472332"
输出:-2147483648
解释:
第 1 步:"-91283472332"(当前没有读入字符,因为没有前导空格)
^
第 2 步:"-91283472332"(读入 '-' 字符,所以结果应该是负数)
^
第 3 步:"-91283472332"(读入 "91283472332")
^
解析得到整数 -91283472332 。
由于 -91283472332 小于范围 [-231, 231 - 1] 的下界,最终结果被截断为 -231 = -2147483648 。
提示:
0 <= s.length <= 200
s 由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-integer-atoi
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
/*
C++版本
(1)关于INT_MIN和INT_MAX
INT_MIN is -2147483648
INT_MAX is 2147483647
INT_MIN和INT_MAX在头文件<climits>中;
(2)关于pos
-代表是否为正数,1表示为正数,-1表示为负数
(3)关于long long
long long 是long long是C++的64位整型的基本类型,“现任”长整型,
从C99开始引入这个概念,在后续的标准中完善概念和定义,C++11官方正式标准如下:
long long-target type will have width of at least 64 bits.(since C++11)
long long占用8个字节,数据表示范围也从int的[-2^{31},2^{31}-1],
升级到[-2^{63},2^{63}-1]
*/
class Solution {
public:
int myAtoi(string s) {
long long result = 0;
// 1. 先忽略空格
int i = 0;
while( s[i] == ' ' ){ ++i; }
// 2. 根据第一个非空格的字符来判断当前数据为正数还是负数,0可以作为正数来处理
int pos = 1;
if(s[i] == '-'){
pos = -1; ++i;
} else if ( s[i] == '+') {
pos = 1; ++i;
} else if ( isdigit(s[i])){
pos = 1;
}
// 3. 遍历字符串
/*
如:255
result=0*10+2 =2
result=2*10+5=25
result=25*10+5
写 if( result*pos < INT_MIN ) return INT_MIN;
if( result*pos > INT_MAX ) return INT_MAX;
是为了处理一旦溢出就要返回的情况
*/
while( i < s.size() && isdigit(s[i]) ){
result = result*10 + (s[i]-'0');
if( !isdigit(s[i]) ) break;
if( result*pos < INT_MIN ) return INT_MIN;
if( result*pos > INT_MAX ) return INT_MAX;
++i;
}
// 4. 根据正负号来判断结果值
result = result*pos;
// 5. 检查大小
if( result < INT_MIN ) result = INT_MIN;
if( result > INT_MAX ) result = INT_MAX;
return result;
}
};
/*
C语言版本
*/
int myAtoi(char * s){
int len =strlen(s);
long long num=0;
int i=0;
int j;
int flag=1;
while(*s==' ') //去除前导空格 更新数组长度
{
s++;
len--;
}
if(*s=='+'){
s++;
len--;
}
else if(*s=='-')
{
flag =-1;
s++;
len--;
}
//int newnum[len];
char *newnum =(char*)malloc(len * sizeof(char));
while(*s!='\0' ) //判断是否到字符串末尾
{
// if(isdigit((char)*s)==0)
if(isdigit((char)*s)==NULL) //若遇到了不是数字,就跳出,代表结束
break;
newnum[i]=(char)*s-48; //求出每个数,'0'的ASCII码为48
num=num*10+newnum[i]; //记录新数字
if(flag*num >= INT_MAX ) return INT_MAX;
else if(flag*num <= INT_MIN ) return INT_MIN;
i++;
s++;
}
if(flag *num >= INT_MAX ) return INT_MAX;
else if(flag *num <= INT_MIN ) return INT_MIN;
else return flag *num;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。