zerofly's Blog

努力不一定成功,但不努力一定不会成功

0%

把字符串转换为整数


题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0

输入描述:

1
输入一个字符串,包括数字字母符号,可以为空

输出描述

1
如果是合法的数值表达则返回该数字,否则返回0

示例1:

输入:

+2147483647
1a33

输出:

1
2
2147483647
0

解题思路

题意要求给的字符串必须满足以下要求:

  • 字符串不为空;

  • 字符串中的元素必须是0~9的数字,或者表示正负的 +\-;

  • int 为32位,需要判断是否发生溢出;

  • 判断是否正常结束;

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class Solution
{
public:
enum Status {kValia = 0, kInValia}; // 枚举
int g_nStatus = kValia;
int StrToInt(string str)
{
long long num = 0;
const char* cstr = str.c_str(); // 指向字符串str的地址

if (cstr != NULL && *cstr != '\0') // 字符串不是空,
{
bool minus = false; // 正负号的标志,默认正为false
if (*cstr == '+')
cstr++;
else if (*cstr == '-')
{
minus = true;
cstr++;
}
if (*cstr != '\0')
num = StrToIntCore(cstr, minus);
}

return (int)num;
}

long long StrToIntCore(const char* cstr, bool minus)
{
long long num = 0;
while (*cstr != '\0')
{
if (*cstr >= '0' && *cstr <= '9')
{
int flag = minus ? -1 : 1;
num = num * 10 + flag * (*cstr - '0'); // 一个数字字符减去零字符,得到的是整型数
if ((!minus && num > 0x7fffffff) || (minus && num < (signed int)0x80000000)) // 有符号int 的取值范围-2147483648~2147483647
{
num = 0;
break;
}
cstr++;
}
else
{
num = 0;
break;
}
}

// 判断是否正常结束
if (*cstr == '\0')
g_nStatus = kValia;
return num;
}
};

但是,在牛客上不能通过,测试用例为:-2147483649超出 int 的取值范围。

参考博文链接:https://cuijiahua.com/blog/2018/01/basis_49.html

https://www.nowcoder.com/questionTerminal/1277c681251b4372bdef344468e4f26e?f=discussion

文章作者:zerofly

发布时间:2020年06月03日 - 15:06

原始链接:http://zeroflycui.github.io/5b88b5e3.html

许可协议: 转载请保留原文链接及作者。